Abstract Factory概要
Abstract Factory模式是一种对象创建模式,意图是提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们(一系列对象)具体的类。
应用场景
Abstract Factory主要使用于以下几种系统设计场景:
1)一个系统要独立于它产品的创建、组合和表示;
2)一个系统要由多个产品系列中的一个来配置;
3)在系统中强调一系列相关产品对象的设计以便进行联合使用;
4)提供一个产品类库,而只公开它们的接口而不是实现。
模式结构
Abstract Factory模式结构可以用下图来表示,该图表示了各类之间的关系:
从上面的模式结构图中我们可以看出,Abstract Factory模式主要有如下5个参与者:
1)AbstractFactory:用来声明创建抽象产品对象的接口,如图中CreateProductA()、CreateProductB()
2)ConcreteFactory:通过重写父类的操作,实现创建具体产品对象的操作
3)AbstractProduct:为一类产品对象声明一个接口
4)ConcreteProduct:通过实现AbstractProduct接口定义一个被相应的(ConcreteFactory)具体工厂创建的具体的产品对象
5)Client:仅使用AbstractFactory和AbstractProduct声明的接口
通过上述方式,客户可以在运行时刻创建ConcreteFactory的实例,这一具体工厂,可以创建有特定实现操作的具体产品对象,如果要创建不同的产品对象,客户则需要使用不同的具体工厂,另外这种设计方式可以延迟产品对象的创建,即AbstractFactory可以延迟产品对象的创建到它的ConcreteFactory子类。
AbstractFactory的优缺点
AbstractFactory采用这种设计方式可以起到1)分离具体的类、2)易于交换产品系列、3)有利于产品的一致性的作用,但缺点也是很明显的----不利于扩展(不利于使用新种类的新产品),这时因为AbstractFactory类中确定了可以被创建的产品对象的集合,如果有新的产品对象需要创建,则需要改变AbstractFactory类的接口,这将导致AbstractFactory类及其所有子类发生改变。
AbstractFactory的实现
在实现AbstractFactory的时候需要注意以下两点:
1)通常一系列产品产品对象只需要一个ConcreteFactory实例,所以工厂的实现一般采用单件Singleton。当然这只是一般情况,涉及到具体情况就要具体分析了。
2)AbstractFactory仅声明一个产品创建的接口,而具体实现则是由ConcreteFactory实现的,所以通常的做法是为每一个产品定义一个工厂方法(FactoryMethod),一个具体的工厂则重定义该工厂方法来指定产品完成产品的创建。
参考:《Design Patterns:Elements of Reusable Object-Oriented Software》- Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides.