1、 Factory模式
注: 1)Product A和Product B具有相同的父类,但是具有不同的实现。
2)Creator可根据不同的输入变量决定所需实例化的类。
优点:将方法与处理分离,处理可以独立于方法名而存在。
使用环境:
i. 当一个类不能静态确定她所必须创建的对象的类的时候。(Client可以在运行时,通过Creator来获得所需的Product子类)
ii. 当一个类希望由她的子类来实现她所定义的行为的时候。(由Product A和Product B来定义Product的行为)
iii. 当你希望将创建类的信息局部化的时候。(可以把if-else的选择代码,放到Creator内)
代码实例:
publicinterface Product {
public void method();
}
public class ProductA implementsProduct{
public void method(){
do some thing;
}
}
public class ProductB implementsProduct{
public void method(){
do another thing;
}
}
publicclass Creator{
public Product getProduct(){
if(some condition){
return new ProductA();
}else{
returnnew ProductB();
}
}
}
-
Abstract Factory模式
注: 1)Factory和ProductA,ProductB形成一个层次。
2)FactoryA和FactoryB继承Factory,并负责实例化ProductA和ProductB的子类。
优点:
i. 可以通过更换Concrete Factory而实现对整个Product的替换。
使用环境:
i. 一个系统要独立于她的产品的创建,组合和表示。(例如,Java中的UI,Client的LookAndFeel可以独立于控件的创建和表示。)
ii. 一个系统要由多个产品系列中的一个来配置。(一个系统可以由Product A1和Product B1或者Product A2和Product B2来配置)
iii. 当你要强调一个系列相关的产品对象的设计以便进行联合使用时。
iv. 当你提供一个产品类库,而只想显示他们的接口而不是实现时(Client通过Factory只看到了Product A和Product B的接口)
小结:
与Factory类似,但返回的是一组类而不仅是一个类,从某种程度上说是Factory模式在更高层次上的抽象。
AbstractFactory将产品对象的创建延迟到他的实现类当中(FactoryA和FactoryB)
AbstractFactory模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程。她将客户与类的实现分离。客户通过他们的抽象接口操纵实例。类名也在具体工厂的实现中被分离,他们并不出现在客户代码中。
难以生产新种类的产品,因为AbstractFactory接口限制了可以被创建的产品集合,支持新种类的产品需要扩展工厂接口。
Swing中的UI部分,是Abstract Factory的一个应用。