抽象工厂模式(Abstract Factory Pattern)
定义:
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
为创建一组相关或相互依赖的对象提供一个接口,而无需指定他们的具体类。
描述:
工厂模式的不足:类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。
抽象工厂是工厂模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象。
通过创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
通用类图:
通用代码:
工厂类的抽象类
package AbstractFactory;public abstract class AbstractCreator { //创建A产品方法 public abstract AbstractProductA createProductA(); //创建B产品方法 public abstract AbstractProductB createProductB();}
产品A的抽象类
package AbstractFactory;public abstract class AbstractProductA { //产品A共有的方法 public void shareMethod(){ System.out.println("产品A共有的业务逻辑处理方法..."); } //产品A不同子产品不同实现 public abstract void doSomething(); }
产品B 的抽象类
package AbstractFactory;public abstract class AbstractProductB { //产品B共有的方法 public void shareMethod(){ System.out.println("产品B共有的业务逻辑处理方法..."); } //产品B不同子产品不同实现 public abstract void doSomething(); }
产品线1的工厂实现类
package AbstractFactory;public class Creator1 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); }}
产品线2的工厂实现类
package AbstractFactory;public class Creator2 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); }}
产品A1
package AbstractFactory;public class ProductA1 extends AbstractProductA { @Override public void doSomething() { System.out.println("产品A1的业务逻辑处理方法..."); }}
产品A2
package AbstractFactory;public class ProductA2 extends AbstractProductA { @Override public void doSomething() { System.out.println("产品A2的业务逻辑处理方法..."); }}
产品B1
package AbstractFactory;public class ProductB1 extends AbstractProductB{ @Override public void doSomething() { System.out.println("B1的业务逻辑处理方法..."); }}
产品B2
package AbstractFactory;public class ProductB2 extends AbstractProductB{ @Override public void doSomething() { System.out.println("B2的业务逻辑处理方法..."); }}
优点:
1.良好的封装性
2.产品族内的约束为非公开状态
缺点:
产品族扩展非常困难,可能要修改抽象类或接口,违背开闭原则。
使用场景:
一个对象族(或者是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式
例如:一个应用需要在三个不同平台上运行,则可以通过抽象工厂模式屏蔽掉操作系统对应用的影响,由不同的产品类去处理与操作系统交互的信息。
参考资料:
《设计模式之禅》 秦小波著
《JAVA设计模式》 搜集整理来自互联网