抽象工厂模式

2016/08/24 设计模式

定义

抽象工厂模式(英语:Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

类图

抽象工厂模式类图

从类图上我们看出相对工厂方法这里多了抽象产品族,而工厂多了创建多出产品族的方法,下面看看java代码实现

java代码实现

抽象产品

public interface ProductA {
    void run();
}

public interface ProductB {
    void run();
}

具体产品

public class ProductA1 implements ProductA {
    @Override
    public void run() {
        System.out.println("beaz1 run");
    }
}

public class ProductB1 implements ProductB {
    @Override
    public void run() {
        System.out.println("bmw1 run");
    }
}

抽象工厂

public interface Creator {
    ProductA creatorProductA();

    ProductB creatorProductB();
}

具体工厂

public class Creator1 implements Creator {
    @Override
    public ProductA creatorProductA() {
        return new ProductA1();
    }

    @Override
    public ProductB creatorProductB() {
        return new ProductB1();
    }
}

实例

看了上面这些类,大家是不有点想起了我们常用的List,就是这种结构。来看看List源码

public interface List<E> extends Collection<E> {

    Iterator<E> iterator();

    ListIterator<E> listIterator();
}

这两个方法是不是正好是抽象工厂构建不同产品的方法呢,然而ArrayList,LinkedList正是具体的工厂,在他们内部有这两个抽象产品IteratorListIterator的具体实现。

总结

设计原则:遵循单一职责、依赖倒置、开闭原则
常用场景:需要一个接口可以提供一个产品族,且不必知道产品的具体种类
使用概率:30%
复杂度:中
变化点:工厂与产品的种类
选择关键点:产品族是否需要一起提供,且是否有一致的接口
逆鳞:无
相关设计模式
建造者模式:两者都是建造一批对象或者说产品,不同的是两者的目的和实现手段,在建造者模式中,是为了复用对象的构建过程而定义了一个指挥者,而在抽象工厂模式中,是为了提供一个这批对象的创建接口而定义了抽象工厂接口。

Search

    Post Directory