AbstractFactory
声明一个创建抽象产品对象的操作接口。
ConcreteFactory
实现创建具体产品对象的操作。
AbstractProduct
为一类产品对象声明一个接口。
ConcreteProduct
定义一个将被相应的具体工厂创建的产品对象。
实现 AbstractProduct 接口。
Client
仅适用由 AbstractFactory 和 AbstractProduct 类声明的接口。
适用性
在以下情况下可以使用 Abstract Factory 模式:
一个
系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
缺点
难以支持新种类的产品。支持新种类的产品就需要扩展 AbstractFactory 接口,这将引起所有子类的改变。
效果
它分离了具体的类。
它使得易于交换产品系列。
它有利于产品的一致性。
相关模式
Abstract Factory 经常用 Factory Method 来实现。
Abstract Factory 也可以用 Prototype 来实现。
一个具体的工厂可以是一个 Singleton。
命名约定
使用命名约定是一个好习惯,例如,总是声明那些定义为抽象工厂的类为 XxxKit。
实现
实现方式(一):使用 Factory Method 来实现 Abstract Factory。
一个具体的工厂将为每个产品重定义该工厂方法以指定产品。
复制代码
1 namespace AbstractFactoryPattern.Implementation1
2 {
3 public abstract class AbstractOrInterfaceOfFactoryKit
4 {
5 public abstract AbstractOrInterfaceOfProductA CreateProductA();
6 public abstract AbstractOrInterfaceOfProductB CreateProductB();
7 }
8
9 public abstract class AbstractOrInterfaceOfProductA
10 {
11 }
12
13 public abstract class AbstractOrInterfaceOfProductB
14 {
15 }
16
17 public class ConcreteFactoryKit1 : AbstractOrInterfaceOfFactoryKit
18 {
19 public override AbstractOrInterfaceOfProductA CreateProductA()
20 {
21 return new ConcreteProductA();
22 }
23
24 public override AbstractOrInterfaceOfProductB CreateProductB()
25 {
26 return new ConcreteProductB();
27 }
28 }
29
30 public class ConcreteProductA : AbstractOrInterfaceOfProductA
31 {
32 }
33
34 public class ConcreteProductB : AbstractOrInterfaceOfProductB
35 {
36 }
37
38 public class Client
39 {
40 public void TestCase1()
41 {
42 AbstractOrInterfaceOfFactoryKit kit = new ConcreteFactoryKit1();
43 AbstractOrInterfaceOfProductA productA = kit.CreateProductA();
44 AbstractOrInterfaceOfProductB productB = kit.CreateProductB();
45 }
46 }
47 }
复制代码
实现方式(二):使用 Prototype 来实现 Abstract Factory。
具体工厂使用产品系列中每一个产品的原型实例来初始化,且它通过复制它的原型来创建新的产品。
复制代码
1 namespace AbstractFactoryPattern.Implementation2
2 {
3 public abstract class AbstractOrInterfaceOfFactoryKit
4 {
5 public abstract AbstractOrInterfaceOfProductA CreateProductA();
6 public abstract AbstractOrInterfaceOfProductB CreateProductB();
7 }
8
9 public abstract class AbstractOrInterfaceOfProductA
10 {
11 public abstract AbstractOrInterfaceOfProductA Clone();
12 }
13
14 public abstract class AbstractOrInterfaceOfProductB
15 {
16 public abstract AbstractOrInterfaceOfProductB Clone();
17 }
18
19 public class ConcreteFactoryKit1 : AbstractOrInterfaceOfFactoryKit
20 {
21 public override AbstractOrInterfaceOfProductA CreateProductA()
22 {
23 return new ConcreteProductA();
24 }
25
26 public override AbstractOrInterfaceOfProductB CreateProductB()
27 {
28 return new ConcreteProductB();
29 }
30 }
31
32 public class ConcreteFactoryK