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