ABSTRACT FACTORY(抽象工厂) – 对象创建型模式
-
意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类型
-
别名:Kit
-
动机:考虑一个支持多种视感(look-and-feel)标准的用户界面工具包。
-
适用性:
a. 一个系统要独立于它得产品的创建、组合和表示时。
b. 一个系统要由多个产品系列中的一个来配置时。
c. 当你要强调一系列相关产品的对象的设计以便进行联合使用。
d. 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
-
结构:
-
参与者:
a. AbstractFactory:声明一个创建抽象产品对象的操作接口
b. ConcreteFactory: 实现创建具体产品对象的操作
c. AbstractProduct: 为一类产品对象声明一个接口
d. ConcreteProduct:定义一个将被相应的具体工厂创建的产品对象。实现AbstractProduct接口
e. Client:仅使用由AbstractFactory和AbstractProduct类声明的接口
-
协作:
通常在运行时刻创建一个ConcreteFactory类的实例。
这一具体的工厂创建具有特定实现的产品对象。
为创建不同的产品对象,客户应使用不同的具体工厂。
-
效果:
a. 它分离了具体类
b. 它使得易于交换产品系列
c. 它有利于产品的一致性
d. 难以支持新品种的产品
-
实现
a. 将工厂作为单件
b. 创建产品
c. 定义可拓展的工厂
-
代码示例:
//抽象工厂 public interface AbstractFactory { public AbstractProductA CreateProductA(); public AbstractProductB CreateProductB(); } //抽象产品A public interface AbstractProductA { public void describe(); } //抽象产品B public interface AbstractProductB { public void describe(); } //实现抽象产品A的产品A1 public class ProductA1 implements AbstractProductA { @Override public void describe() { System.out.println("This is ProductA1"); } } //实现抽象产品A的产品A2 public class ProductA2 implements AbstractProductA { @Override public void describe() { System.out.println("This is ProductA2"); } } //实现抽象产品B的产品B1 public class ProductB1 implements AbstractProductB { @Override public void describe() { System.out.println("This is ProductB1"); } } //实现抽象产品B的产品B2 public class ProductB2 implements AbstractProductB { @Override public void describe() { System.out.println("This is ProductB2"); } } //实现抽象工厂的具体工厂1 public class ConcreteFactory1 implements AbstractFactory { @Override public AbstractProductA CreateProductA() { return new ProductA1(); } @Override public AbstractProductB CreateProductB() { return new ProductB1(); } } //实现抽象工厂的具体工厂2 public class ConcreteFactory2 implements AbstractFactory { @Override public AbstractProductA CreateProductA() { return new ProductA2(); } @Override public AbstractProductB CreateProductB() { return new ProductB2(); } } //客户端调用 public class Client { public static void main(String[] args) { AbstractFactory factory1 = new ConcreteFactory1(); AbstractProductA productA1 = factory1.CreateProductA(); AbstractProductB productB1 = factory1.CreateProductB(); productA1.describe(); productB1.describe(); } }
-
已知应用
-
相关模式:
AbstractFactory类通常用工厂方法(Factory Method)实现,但它们也可以用Prototype实现。
一个具体的工厂通常是一个单件(Singleton)