设计模式之美:Abstract Factory(抽象工厂)(二)
it2 : AbstractOrInterfaceOfFactoryKit
33 {
34 private AbstractOrInterfaceOfProductA _prototypeOfProductA;
35 private AbstractOrInterfaceOfProductB _prototypeOfProductB;
36
37 public ConcreteFactoryKit2(
38 AbstractOrInterfaceOfProductA prototypeOfProductA,
39 AbstractOrInterfaceOfProductB prototypeOfProductB)
40 {
41 _prototypeOfProductA = prototypeOfProductA;
42 _prototypeOfProductB = prototypeOfProductB;
43 }
44
45 public override AbstractOrInterfaceOfProductA CreateProductA()
46 {
47 return _prototypeOfProductA.Clone();
48 }
49
50 public override AbstractOrInterfaceOfProductB CreateProductB()
51 {
52 return _prototypeOfProductB.Clone();
53 }
54 }
55
56 public class ConcreteProductA : AbstractOrInterfaceOfProductA
57 {
58 public override AbstractOrInterfaceOfProductA Clone()
59 {
60 return new ConcreteProductA();
61 }
62 }
63
64 public class ConcreteProductB : AbstractOrInterfaceOfProductB
65 {
66 public override AbstractOrInterfaceOfProductB Clone()
67 {
68 return new ConcreteProductB();
69 }
70 }
71
72 public class Client
73 {
74 public void TestCase2()
75 {
76 AbstractOrInterfaceOfFactoryKit kit1 = new ConcreteFactoryKit1();
77 AbstractOrInterfaceOfProductA productA1 = kit1.CreateProductA();
78 AbstractOrInterfaceOfProductB productB1 = kit1.CreateProductB();
79
80 AbstractOrInterfaceOfFactoryKit kit2 = new ConcreteFactoryKit2(productA1, productB1);
81 AbstractOrInterfaceOfProductA productA2 = kit2.CreateProductA();
82 AbstractOrInterfaceOfProductB productB2 = kit2.CreateProductB();
83 }
84 }
85 }
复制代码
实现方式(三):定义可扩展的 Abstract Factory。
Abstract Factory 通常为每一种它可以生产的产品定义一个操作。产品的种类被编码在操作型构中。
增加一种新的产品要求改变 Abstract Factory 的接口以及所有与它相关的类。
一个更灵活但不太安全的设计是给创建对象的操作增加一个参数。该参数指定了将被创建的对象的种类。
该参数可以是一个类标识符、一个整数、一个字符串,或其他任何可以标识这种产品的东西。
这样改动之后,Abstract Factory 只需要一个 "Make" 操作和一个指示要创建对象的种类的参数。
复制代码
1 namespace AbstractFactoryPattern.Implementation3
2 {
3 public enum ProductCategory
4 {
5 ProductA,
6 ProductB,
7 }
8
9 public abstract class AbstractOrInterfaceOfFactoryKit
10 {
11 public abstract object CreateProduct(ProductCategory category);
12 }
13
14 public abstract class AbstractOrInterfaceOfProductA
15 {
16 }
17
18 public abstract class AbstractOrInterfaceOfProductB
19 {
20 }
21
22 public class ConcreteFactoryKit1 : AbstractOrInterfaceOfFactoryKit
23 {
24 public override object CreateProduct(ProductCategory category)
25 {
26 switch (category)
27 {
28 case ProductCategory.ProductA:
29 return new ConcreteProductA();
30 case ProductCategory.ProductB:
31 return new ConcreteProductB();
32 default:
33 throw new NotSupportedException();
34 }
35 }
36 }
37
38 public class ConcreteProductA : AbstractOrInterfaceOfProductA
39 {
40 }
41
42 public class ConcreteProductB : AbstractOrInterfaceOfProductB
43 {
44 }
45
46 public class Client
47 {
48 publi