设计模式-抽象工厂模式

一、定义

抽象工厂模式(Abstract Factory Pattern)是一种比较常见的模式,其定义如下:

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)

抽象工厂模式的通用类图为:

抽象工厂模式的通用类图

//抽象产品类
public abstract class AbstractProductA {
    public void shareMethod() {
        //每个产品共有的方法
    }
    
    //每个产品相同方法,不同实现
    public abstract void doSomething();
}

//产品A1的实现类
public class ProductA1 extends AbstractProductA {
    public void doSomething() {
        System.out.println("产品A1的实现方法");
    }
}

//产品A2的实现类
public class ProductA2 extends AbstractProductA {
    public void doSomething() {
        System.out.println("产品A2的实现方法");
    }
}

//抽象工厂类
public abstract class AbstractCreator {
    public abstract AbstractProductA createProductA();
    
    public abstract AbstractProductB createProductB();
}

//产品等级1的实现类
public class Creator1 extends AbstractCreator {
    public AbstractProductA createProductA {
        return new ProductA1();
    }
    
    public AbstractProductB createProductB() {
        return new ProductB1();
    }
}

//产品等级2的实现类
public class Creator2 extends AbstractCreator{
    public AbstractProductA createProductA() {
        return new ProductA2();
    }
    
    public AbstractProductB createProductB() {
        return new ProductB2();
    }
}

注意:有M个产品就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族的生成任务。

public class Client {
   public static void main(String[] args) {
       AbstractCreator creator1 = new Creator1();
       AbstractCreator creator2 = new Creator2();
       
       AbstractProductA a1 = creator1.createProductA();
       AbstractProductA a2 = creator2.createProductA();
       AbstractProductB b1 = creator1.createProductB();
       AbstractProductB b2 = creator2.createProductB();
   }
}

二、应用

2.1 优点

  • 封装性,每个产品的实现类不是高层模块要关心的,他要关心的是接口,是抽象,他不关心对象是如何创建出来。这是由工厂类负责的,只要知道工厂类是谁,我就能创建出一个需要需要的对象。
  • 产品族内的约束为非公开状态。

2.2 缺点

最大缺点就是产品族扩展非常困难。如果我们要增加一个产品,抽象类AbstractCreator要增加一个方法,然后两个实现类都要修改,这违背了开闭原则。

2.3 使用场景

一个对象族(或是一组没有任何关系的对象)都有相同的约束,就可以使用抽象工厂模式。例如一个文本编辑器和一个图片处理器,都是软件实体。但是*nixd下的文本编辑器和windows下的文本编辑器虽然功能和界面都相同,但是代码实现不同,图片处理器也有类似情况。也就是具备了相同的约束条件:操作系统类型。于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

posted @ 2016-12-19 11:28  飞轩  阅读(207)  评论(0编辑  收藏  举报