使用工厂方法模式:工厂方法模式中每个工厂只生产一类产品,那么就必须要有海尔电视机厂、海尔电冰箱厂、海尔空调厂、海信电视机厂、海信电冰箱厂、海信空调厂
使用抽象工厂模式:抽象工厂中每个工厂生产由多种产品组成的"产品族",那么就只需要有海尔工厂、海信工厂就够了,每个工厂可生产自家的电视机、电冰箱、空调。
由此看出使用抽象工厂模式极大地减少了系统中类的个数。
模式定义抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。抽象工厂模式定义如下:
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。
模式结构图在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族,抽象工厂模式结构如图所示:
在抽象工厂模式结构图中包含如下几个角色:
AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
模式伪代码在抽象工厂中声明了多个工厂方法,用于创建不同类型的产品,抽象工厂可以是接口,也可以是抽象类或者具体类,其典型代码如下所示:
public abstract class AbstractFactory { public abstract AbstractProductA createProductA(); public abstract AbstractProductB createProductB(); public abstract AbstractProductC createProductC(); }具体工厂实现了抽象工厂,每一个具体的工厂方法可以返回一个特定的产品对象,而同一个具体工厂所创建的产品对象构成了一个产品族。对于每一个具体工厂类,其典型代码如下所示:
public class ConcreteFactory1 extends AbstractFactory { @Override public AbstractProductA createProductA() { return new ConcreteProductA1(); } @Override public AbstractProductB createProductB() { return new ConcreteProductB1(); } @Override public AbstractProductC createProductC() { return new ConcreteProductC1(); } } 模式小结如果一开始就学习抽象工厂模式估计很难理解为什么这样设计,按次序学习分析简单工厂模式、工厂方法模式、抽象工厂模式基本就顺理成章了。实际开发中,可能并不是照搬照套工厂模式三兄弟的伪代码,大多会简化其中的部分实现。本来学习设计模式就是重思想,学习如何用抽象类、接口、拆分、组合等将软件解耦合,并增强系统可扩展性,这才是最关键的。