目录
概念
抽象工厂模式是工厂方法模式的升级版,当需要创建的产品有多个产品线(产品族)时使用抽象工厂模式是比较好的选择。
即:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
UML分析
结构与实现
这里我们定义两个产品线,产品线一生产数据库连接驱动,产品线儿生产数据库命令驱动
//产品线一 生成连接
interface IConnection{
void connect();
}
// 产品线二 生产命令
interface ICommand{
void command();
}
- 具体产品
Mysql 相关产品
class MysqlConnetion implements IConnection{
@Override
public void connect() {
System.out.println("Mysql connection");
}
}
class MysqlCommand implements ICommand{
@Override
public void command() {
System.out.println("Mysql...command");
}
}
Oracle相关产品
class OracleConnetion implements IConnection{
@Override
public void connect() {
System.out.println("Oracle connetion");
}
}
class OracleCommand implements ICommand {
@Override
public void command() {
System.out.println("Oracle...command");
}
}
- 定义抽象工厂
interface IDataBaseFactory {
IConnection getConnection();
ICommand getCommand();
}
- 具体工厂实现
class MysqlFactory implements IDataBaseFactory {
@Override
public IConnection getConnection() {
return new MysqlConnetion();
}
@Override
public ICommand getCommand() {
return new MysqlCommand();
}
}
class OracleFactory implements IDataBaseFactory {
@Override
public IConnection getConnection() {
return new OracleConnetion();
}
@Override
public ICommand getCommand() {
return new OracleCommand();
}
}
- 调用
public class AbstractFactory {
public static void main(String[] args) {
IDataBaseFactory iDataBaseFactory = new MysqlFactory();
IConnection connection = iDataBaseFactory.getConnection();
connection.connect();
ICommand command = iDataBaseFactory.getCommand();
command.command();
}
}
- 输出
总结
开闭原则的倾斜性
(1) 增加产品族:对于增加新的产品族,抽象工厂模式很好地支持了“开闭原则”,只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改。
(2) 增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,违背了“开闭原则”。
正因为抽象工厂模式存在“开闭原则”的倾斜性,它以一种倾斜的方式来满足“开闭原则”,为增加新产品族提供方便,但不能为增加新产品结构提供这样的方便,因此要求设计人员在设计之初就能够全面考虑,不会在设计完成之后向系统中增加新的产品等级结构,也不会删除已有的产品等级结构,否则将会导致系统出现较大的修改,为后续维护工作带来诸多麻烦。