工厂方法模式(Factory Method Pattern)

      工厂方法模式(Factory Method Pattern)是最常用的设计模式之一,也是一种创建型模式(Creational Pattern)。适用场景是:在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。

      下面实现该模式的代码,以一个匹萨快餐店为例,在场景中,经常变换的需求是匹萨店的位置(老板的生意不错,很多地方都有分店),但假设不变的是匹萨的工艺和匹萨的种类(老板可能不是一个喜欢创新的人)。

      工厂方法模式的结构图,在实现代码中的对应关系是:

      PizzaFactory = Creator, 

      NYPizzaFactory(ChicagoPizzaFactory) = ConcreteCreator,

      Pizza = Product,

      NYStyleCheesePizza(NYStyleClamPizza/ChicagoStyleCheesePizza/ChicagoStyleClamPizza) = ConcreteProduct

 

  1     public abstract class PizzaFactory
  2     {
  3         public abstract Pizza CreatePizza(PizzaType type);
  4     }
  5 
  6 
  7     /// <summary>
  8     /// 纽约店
  9     /// </summary>
 10     public class NYPizzaFactory : PizzaFactory
 11     {
 12         public override Pizza CreatePizza(PizzaType pizzaType)
 13         {
 14             Pizza pizza = null;
 15 
 16             if (pizzaType.Equals(PizzaType.干酪匹萨))
 17             {
 18                 pizza = new NYStyleCheesePizza();
 19             }
 20             else if (pizzaType.Equals(PizzaType.蛤俐匹萨))
 21             {
 22                 pizza = new NYStyleClamPizza();
 23             }
 24 
 25             if (pizza != null) pizza.Produce();
 26 
 27             return pizza;
 28         }
 29     }
 30 
 31 
 32     /// <summary>
 33     /// 芝加哥店
 34     /// </summary>
 35     public class ChicagoPizzaFactory : PizzaFactory
 36     {
 37         public override Pizza CreatePizza(PizzaType pizzaType)
 38         {
 39             Pizza pizza = null;
 40 
 41             if (pizzaType.Equals(PizzaType.干酪匹萨))
 42             {
 43                 pizza = new ChicagoStyleCheesePizza();
 44             }
 45             else if (pizzaType.Equals(PizzaType.蛤俐匹萨))
 46             {
 47                 pizza = new ChicagoStyleClamPizza();
 48             }
 49 
 50             if (pizza != null) pizza.Produce();
 51 
 52             return pizza;
 53         }
 54     }
 55 
 56     public enum PizzaType
 57     {
 58         干酪匹萨 = 1,
 59         蛤俐匹萨 = 2
 60     }
 61 
 62     public abstract class Pizza
 63     {
 64         protected string Name;
 65         protected string Dough;
 66         protected string Sauce;
 67         protected ArrayList toppings = new ArrayList();
 68 
 69         protected void Prepare()
 70         {
 71             Console.WriteLine("准备做一个 {0}", Name);
 72             Console.WriteLine("制作匹萨面皮");
 73             Console.WriteLine("添加调味汁");
 74             Console.WriteLine("添加表面材料");
 75 
 76             for (int i = 0; i < toppings.Count; i++)
 77             {
 78                 Console.WriteLine("     {0}", Convert.ToString(toppings[i]));
 79             }
 80         }
 81 
 82         protected virtual void Bake()
 83         {
 84             Console.WriteLine("350度烘烤25分钟");
 85         }
 86 
 87         protected virtual void Cut()
 88         {
 89             Console.WriteLine("将匹萨切成尖角型");
 90         }
 91 
 92         protected virtual void Box()
 93         {
 94             Console.WriteLine("将匹萨打包成商务餐装");
 95         }
 96 
 97         public virtual void Produce()
 98         {
 99             Prepare();
100             Bake();
101             Cut();
102             Box();
103         }
104 
105         public string pizzaName
106         {
107             get { return this.Name; }
108         }
109     }
110 
111     /// <summary>
112     /// 纽约风味的干酪匹萨
113     /// </summary>
114     public class NYStyleCheesePizza : Pizza
115     {
116         public NYStyleCheesePizza()
117         {
118             this.Name = "纽约式干酪匹萨";
119             this.Dough = "纽约式脆皮薄片";
120             this.Sauce = "纽约式奶油沙司";
121 
122             this.toppings.Add("纽约式碎干酪");
123         }
124 
125         protected override void Box()
126         {
127             Console.WriteLine("将匹萨打包成纽约式商务餐装.");
128         }
129     }
130 
131     /// <summary>
132     /// 纽约风味的蛤俐匹萨
133     /// </summary>
134     public class NYStyleClamPizza : Pizza
135     {
136         public NYStyleClamPizza()
137         {
138             this.Name = "纽约式蛤俐匹萨";
139             this.Dough = "纽约式薄厚适中";
140             this.Sauce = "纽约式调味品+纽约式辣椒";
141 
142             this.toppings.Add("纽约式哈俐");
143             this.toppings.Add("纽约式葱");
144             this.toppings.Add("纽约式碎香肠");
145         }
146 
147         protected override void Box()
148         {
149             Console.WriteLine("将匹萨打包成纽约式商务餐装.");
150         }
151     }
152 
153     /// <summary>
154     /// 芝加哥风味的干酪匹萨
155     /// </summary>
156     public class ChicagoStyleCheesePizza : Pizza
157     {
158         public ChicagoStyleCheesePizza()
159         {
160             this.Name = "芝加哥式干酪匹萨";
161             this.Dough = "芝加哥式脆皮薄片";
162             this.Sauce = "芝加哥式奶油沙司";
163 
164             this.toppings.Add("芝加哥式碎干酪");
165         }
166     }
167 
168     /// <summary>
169     /// 芝加哥风味的蛤俐匹萨
170     /// </summary>
171     public class ChicagoStyleClamPizza : Pizza
172     {
173         public ChicagoStyleClamPizza()
174         {
175             this.Name = "芝加哥式蛤俐匹萨";
176             this.Dough = "芝加哥式薄厚适中";
177             this.Sauce = "芝加哥式调味品+芝加哥式辣椒";
178 
179             this.toppings.Add("芝加哥式哈俐");
180             this.toppings.Add("芝加哥式葱");
181             this.toppings.Add("芝加哥式碎香肠");
182         }
183     }

 

posted @ 2009-07-12 18:45  binfen  阅读(267)  评论(0编辑  收藏  举报