定义
定义
提供一系列相关或者相互依赖对象的接口,而无需指定他们的具体的类
具体的工厂负责实现具体的产品实例。
与工厂方法模式的区别
- 抽象工厂中每个工厂可以创建多种类的产品;
- 而工厂方法每个工厂只能创建一类
应用场景
- 程序需要处理不同系列的相关产品,但是不希望他依赖于这些产品的具体类时,可以使用抽象工厂
- 系统不依赖产品创建方式,有多个系列产品且只消费其中某一系列,要求提供统一接口的产品库。
优点
实现案例
模拟一个发送sql语句到不同数据库的案例
graph LR
A[获取具体的数据库工厂类] --> B(调用方法创建连接) --> C(发送sql语句)
1、创建 连接数据库
、发送sql
、数据库工厂
接口
// 连接数据库接口
public interface IConnection {
void connect(); // 连接
}
// 发送sql接口
public interface ICommand {
void sendSql(); // 发送sql方法
}
// 数据库工厂接口
public interface IDatabaseFactory {
IConnection createConnection(); // 创建连接
ICommand createCommand(); // 发送sql
}
2、不同数据库实现相关接口
mysql实现
// 实现连接数据库接口
public class MysqlConnection implements IConnection{
@Override
public void connect() {
System.out.println("MysqlConnection connect");
}
}
// 实现发送sql接口
public class MysqlCommand implements ICommand{
@Override
public void sendSql() {
System.out.println("mysql数据库发送sql语句");
}
}
// 实现数据库工厂接口
public class MysqlDatabaseFactory implements IDatabaseFactory{
// 创建Mysql连接
@Override
public IConnection createConnection() {
return new MysqlConnection();
}
// 创建Mysql发送sql
@Override
public ICommand createCommand() {
return new MysqlCommand();
}
}
PostgreSQL实现
// 实现连接数据库接口
public class PostgreSQLConnection implements IConnection{
@Override
public void connect() {
System.out.println("PostgreSQLConnection connect");
}
}
// 实现发送sql接口
public class PostgreSQLCommand implements ICommand{
@Override
public void sendSql() {
System.out.println("PostgreSQL数据库发送sql语句");
}
}
// 实现数据库工厂接口
public class PostgreSQLDatabaseFactory implements IDatabaseFactory{
// 创建PostgreSQL连接
@Override
public IConnection createConnection() {
return new PostgreSQLConnection();
}
// 创建PostgreSQL发送sql
@Override
public ICommand createCommand() {
return new PostgreSQLCommand();
}
}
测试
客户端通过实例化具体的工厂类,并调用其创建不同目标数据库实现的方法创建不同具体数据库类的实例
public class Client {
public static void main(String[] args) {
// 测试mysql
IDatabaseFactory mysql = new MysqlDatabaseFactory();
mysql.createConnection().connect();
mysql.createCommand().sendSql();
// 测试pgsql
IDatabaseFactory pgsql = new PostgreSQLDatabaseFactory();
pgsql.createConnection().connect();
pgsql.createCommand().sendSql();
}
}
运行结果:
MysqlConnection connect
mysql数据库发送sql语句
PostgreSQLConnection connect
PostgreSQL数据库发送sql语句
评论区