抽象工厂模式
-
定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。抽象工厂模式是所有工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式是所有工厂模式中最一般的形式,当抽象工厂模式退化到只有一个产品等级结构时,就变成了工厂方法模式;当工厂方法模式的工厂类只有一个时,且工厂方法为静态方法时,就变成了简单工厂模式。 -
使用场景:
提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
-
UML:
- AbstractProductA表示抽象产品A。
- ProductA1和ProductA2均是AbstractProductA的子类。
- AbstractProductB表示抽象产品B。
- ProductB1和ProductB2均是AbstractProductB的子类。
- AbstractFactory表示抽象工厂类。
- AbstractFactory1和AbstractFactory2是AbstractFactory的子类。
- AbstractFactory1可以创建ProductA1和ProductB1的实例,而AbstractFactory2可以创建ProductA2和ProductB2的实例。
-
优点:
- 抽象工厂模式最大的好处就是易于交换产品系列,由于具体的工厂类在同一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
- 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例的,产品的具体类名也被具体工厂实现分离,不会出现在客户代码中。
-
缺点:
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
-
样例:
public interface AbstractProductA{ }
public class ProductA1 implements AbstractProductA{ }
public class ProductA2 implements AbstractProductA{ }
public interface AbstractProductB{ }
public class ProductB1 implements AbstractProductB{ }
public class ProductB2 implements AbstractProductB{ }
public abstract class AbstractFactory{ public abstract AbstractProductA createProductA(); public abstract AbstractProductB createProductB(); }
public class Factory1 extends AbstractFactory{ public AbstractProductA createProductA(){ return new ProductA1() ; } public AbstractProductB createProductB(){ return new ProductB1() ; } }
public class Factory2 extends AbstractFactory{ public AbstractProductA createProductA(){ return new ProductA2() ; } public AbstractProductB createProductB(){ return new ProductB2() ; } }