简介:
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。
一个具体工厂创建一个产品族,一个产品族是不同系列产品的组合,产品的创建的逻辑分在在每个具体工厂类中。所有的具体工厂继承自同一个抽象工厂。
客户端创建不同产品族的工厂,产品族的工厂创建具体的产品对客户端是不可见的。
增加新的产品族时,需要增加具体工厂类,符合OCP原则。
增加新产品时,需要修改具体工厂类和增加产品类,不符合OCP(开闭原则)
如果没有应对“多系列对象创建”的需求变化,则没有必要使用抽象工厂模式,这时候使用简单的静态工厂完全可以。
- //抽象产品类
- public abstract class AbstractProductA {
- //每个产品共有的方法
- public void shareMethod(){
- }
- //每个产品相同方法,不同实现
- public abstract void doSomething();
- }
产品A1的实现类- public class ProductA1 extends AbstractProductA {
- public void doSomething() {
- System.out.println("产品A1的实现方法");
- }
- }
产品B与此类似,不再赘述。- 产品A2的实现类
- public class ProductA2 extends AbstractProductA {
- public void doSomething() {
- System.out.println("产品A2的实现方法");
- }
- }
- 抽象工厂类
- public abstract class AbstractCreator {
- //创建A产品家族
- public abstract AbstractProductA createProductA();
- //创建B产品家族
- public abstract AbstractProductB createProductB();
- }
注意:有N个产品族,在抽象工厂类中就应该有N个创建方法。
- 产品等级1的实现类
- public class Creator1 extends AbstractCreator {
- //只生产产品等级为1的A产品
- public AbstractProductA createProductA() {
- return new ProductA1();
- }
- //只生产产品等级为1的B产品
- public AbstractProductB createProductB() {
- return new ProductB1();
- }
- }
注意:M个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务。- 产品等级2的实现类
- public class Creator2 extends AbstractCreator {
- //只生产产品等级为2的A产品
- public AbstractProductA createProductA() {
- return new ProductA2();
- }
- //只生产产品等级为2的B产品
- public AbstractProductB createProductB() {
- return new ProductB2();
- }
- }
场景类如下:
- public class Client {
- public static void main(String[] args) {
- //定义出两个工厂
- Abstract Creator creator1 = new Creator1();
- Abstract Creator creator2 = new Creator2();
- //产生A1对象
- AbstractProductA a1 = creator1.createProductA();
- //产生A2对象
- AbstractProductA a2 = creator2.createProductA();
- //产生B1对象
- AbstractProductB b1 = creator1.createProductB();
- //产生B2对象
- AbstractProductB b2 = creator2.createProductB();
- }
- }
-
抽象工厂模式的优点:
● 封装性。
每个产品的实现类不是高层模块要关心的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出
来,这由谁负责呢?工厂类,只要知道工厂类是谁,我就能创建出一个需要的对象,省时省力,优秀设计就应该如
此。
● 产品族内的约束为非公开状态。
缺点:
抽象工厂模式的最大缺点就是产品族扩展非常困难,为什么这么说呢?我们以通用代码为例,如果要增加一个产品C,也就是说产品家族由原来的2个增加到3个,看看我们的程序有多大改动吧!抽象类AbstractCreator要增加一个
方法createProductC(),然后两个实现类都要修改,想想看,这严重违反了开闭原则,而且我们一直说明抽象类和接
口是一个契约。改变契约,所有与契约有关系的代码都要修改,那么这段代码叫什么?叫“有毒代码”,——只要与这
段代码有关系,就可能产生侵害的危险!
-
两种设计模式的区别:
区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。
工厂方法模式与抽象工厂模式对比:
工厂方法模式
抽象工厂模式
针对的是一个产品等级结构 针对的是面向多个产品等级结构 一个抽象产品类 多个抽象产品类 可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类 一个抽象工厂类,可以派生出多个具体工厂类 一个抽象工厂类,可以派生出多个具体工厂类 每个具体工厂类只能创建一个具体产品类的实例
浙公网安备 33010602011771号