抽象工厂模式
抽象工厂(Kit)模式提供一个接口,用来创建相关或依赖对象的家族,而不需要明确指定具体类。
特点:
1. 抽象工厂模式面对的问题是多个产品等级结构的系统设计
2. 抽象工厂模式是工厂方法的进一步推广
3. 抽象工厂将产品对象的创建延迟到它的具体工厂的子类。
4. 通常在运行时刻创建一个具体工厂类的实例,这一具体工厂的创建具有特定实现的产品对象,为创建不同的产品对象,客户应使用不同的具体工厂。
实现:
抽象工厂(提供不同等级结构的产品工厂):
public interface Creator { public ProductA factoryA(); public ProductB factoryB(); }
具体工厂(实现不同等级结构中的某一族产品对象):
public class ConcreteCreator1 implements Creator { public ProductA factoryA() { return new ProductA1(); } public ProductB factoryB() { return new ProductB1(); } }
public class ConcreteCreator2 implements Creator { public ProductA factoryA() { return new ProductA1(); } public ProductB factoryB() { return new ProductB1(); } }
抽象产品:
public interface ProductA { }
public interface ProductB { }
具体产品:
public class ProductA1 implements ProductA { public ProductA1() { } }
public class ProductA2 implements ProductA { public ProductA2() { } }
public class ProductB1 implements ProductA { public ProductB1() { } }
public class ProductB2 implements ProductA { public ProductB2() { } }
相图:
每一个产品族都有一个具体工厂。而每一个具体工厂负责创建属于同一个产品族、但是分属于不同等级结构的产品。
适用性:
1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的
2. 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
3. 同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来
4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现
参与者:
- AbstractFactory:创建抽象产品对象的接口
- ConcreteFactory:实现创建具体产品对象的操作
- AbstractProduct:为一类产品对象声明一个接口
- ConcreteProduct:定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口
- Client:仅使用由AbstractFactory和AbstractProduct类声明的接口
优点:
1. 分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
2. 它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。
3. 它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
缺点:
增加新的产品等级结构的时候,要改变抽象工厂接口,不支持“开-闭”原则
posted on 2010-05-20 20:09 God bless you 阅读(700) 评论(0) 编辑 收藏 举报