1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace DesignPattern.CreationalPattern
8 {
9 #region 抽象工厂模式要点
10
11 //定义:提供抽象接口用于创建一系列相关或依赖的对象,而不具体指定对象类型
12
13 //优点:
14 //1.抽象工厂类将创建具体类型产品的过程推迟到其子类进行,将对象的创建封装起来,减少对具体对象的依赖耦合
15 //2.遵循开放封闭原则,可在不修改抽象工厂代码的情况下为其增加新的具体工厂用于生产一系列新产品
16 //缺点:
17 //若要增加新的产品接口,就需要修改抽象工厂,所有具体工厂就都需要实现新的接口,违反开放封闭原则
18 //使用注意:
19 //一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
20 //这个系统有多个系列产品,而系统中只消费其中某一系列产品
21 //系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
22
23 #endregion
24
25 //示例:
26 public abstract class AbstractFactoryPattern
27 {
28 public abstract Shoes MakeShoe();
29 public abstract Coat MakeCoat();
30 public abstract Pants MakePant();
31 }
32
33
34 public class AdidasFactory : AbstractFactoryPattern
35 {
36 public override Shoes MakeShoe()
37 {
38 return new AdidasShoes();
39 }
40
41 public override Coat MakeCoat()
42 {
43 return new AdidasCoat();
44 }
45
46 public override Pants MakePant()
47 {
48 return new AdidasPants();
49 }
50 }
51
52
53 public class NikeFactory : AbstractFactoryPattern
54 {
55 public override Shoes MakeShoe()
56 {
57 return new NikeShoes();
58 }
59
60 public override Coat MakeCoat()
61 {
62 return new NikeCoat();
63 }
64
65 public override Pants MakePant()
66 {
67 return new NikePants();
68 }
69 }
70
71 /**************************************需创建的对象*********************************/
72
73 public abstract class Shoes
74 {
75 public abstract void Print();
76 }
77
78 public class AdidasShoes : Shoes
79 {
80 public override void Print()
81 {
82 Console.WriteLine("adidas shoes");
83 }
84 }
85
86 public class NikeShoes : Shoes
87 {
88 public override void Print()
89 {
90 Console.WriteLine("Nike shoes");
91 }
92 }
93
94
95 public abstract class Pants
96 {
97 public abstract void Print();
98 }
99
100 public class AdidasPants : Pants
101 {
102 public override void Print()
103 {
104 Console.WriteLine("adidas Pants");
105 }
106 }
107 public class NikePants : Pants
108 {
109 public override void Print()
110 {
111 Console.WriteLine("nike Pants");
112 }
113 }
114
115
116 public abstract class Coat
117 {
118 public abstract void Print();
119 }
120
121 public class AdidasCoat : Coat
122 {
123 public override void Print()
124 {
125 Console.WriteLine("adidas Coat");
126 }
127 }
128
129 public class NikeCoat : Coat
130 {
131 public override void Print()
132 {
133 Console.WriteLine("nike Coat");
134 }
135 }
136 }