设计模式之美:Abstract Factory(抽象工厂)(三)

2014-11-24 01:03:54 · 作者: · 浏览: 1
c void TestCase3()
49 {
50 AbstractOrInterfaceOfFactoryKit kit = new ConcreteFactoryKit1();
51 AbstractOrInterfaceOfProductA productA = (AbstractOrInterfaceOfProductA)kit.CreateProduct(ProductCategory.ProductA);
52 AbstractOrInterfaceOfProductB productB = (AbstractOrInterfaceOfProductB)kit.CreateProduct(ProductCategory.ProductB);
53 }
54 }
55 }
复制代码
实现方式(四):使用模板以避免创建子类。
使用C#中的泛型实现抽象工厂。
复制代码
1 namespace AbstractFactoryPattern.Implementation4
2 {
3 public abstract class AbstractOrInterfaceOfFactoryKit
4 {
5 public abstract AbstractOrInterfaceOfProductA CreateProductA();
6 public abstract AbstractOrInterfaceOfProductB CreateProductB();
7 public abstract AbstractOrInterfaceOfProductC CreateProductC()
8 where TC : AbstractOrInterfaceOfProductC, new();
9 }
10
11 public abstract class AbstractOrInterfaceOfProductA
12 {
13 }
14
15 public abstract class AbstractOrInterfaceOfProductB
16 {
17 }
18
19 public abstract class AbstractOrInterfaceOfProductC
20 {
21 }
22
23 public class ConcreteFactoryKit1 : AbstractOrInterfaceOfFactoryKit
24 where TA : AbstractOrInterfaceOfProductA, new()
25 where TB : AbstractOrInterfaceOfProductB, new()
26 {
27 public override AbstractOrInterfaceOfProductA CreateProductA()
28 {
29 return new TA();
30 }
31
32 public override AbstractOrInterfaceOfProductB CreateProductB()
33 {
34 return new TB();
35 }
36
37 public override AbstractOrInterfaceOfProductC CreateProductC()
38 {
39 return new TC();
40 }
41 }
42
43 public class ConcreteProductA : AbstractOrInterfaceOfProductA
44 {
45 }
46
47 public class ConcreteProductB : AbstractOrInterfaceOfProductB
48 {
49 }
50
51 public class ConcreteProductC : AbstractOrInterfaceOfProductC
52 {
53 }
54
55 public class Client
56 {
57 public void TestCase4()
58 {
59 AbstractOrInterfaceOfFactoryKit kit = new ConcreteFactoryKit1();
60 AbstractOrInterfaceOfProductA productA = kit.CreateProductA();
61 AbstractOrInterfaceOfProductB productB = kit.CreateProductB();
62 AbstractOrInterfaceOfProductC productC = kit.CreateProductC();
63 }
64 }
65 }