生产器模式

作者: 苏石 07770107

模式名称

生产器模式

模式介绍

生成器(Builder)模式,也被称为建造者模式或构造器模式,属于创建型模式,它是将一个复杂的对象的构造与这个复杂对象的表示分离开 ,使得同样的构建构成可以创建不同的表示。

问题提出

生活场景:仍以生产洗发水为例,原生产的洗发水只有一种类型,比如:功效是去屑,包装都是一样的。但随着科技的发展、消费水平的提升,只生产这种单一类型的洗发水已经不能满足当今多元化的市场了,现在厂商决定扩大生产规模,生产除去屑的还要柔顺的、控油的等等,包装要多种颜色,不同形状的,若针对特殊节日就要生产特惠装或带赠品的。

终极目标:实现生产多样化洗发水,进行建模。

 

1.不假思索的思路建立洗发水类,通过构造器实现洗发水的整个生产加工过程。

 

代码
1 public class Shampoo
2 {
3
4 public Shampoo(String str)
5 {
6 if ("AntiDandruff".Equals(str))
7 {
8 Console.WriteLine("生产了去屑洗发水原料");
9 Console.WriteLine("生产了去屑洗发水包装,蓝色装ml");
10 Console.WriteLine("添加赠品,ml柔顺洗发水瓶");
11 Console.WriteLine("生产了一批‘买ml送特惠装’去屑洗发水!");
12 }
13 if ("SmoothIntense".Equals(str))
14 {
15 Console.WriteLine("生产了去屑洗发水原料");
16 Console.WriteLine("生产了去屑洗发水包装,红色装ml");
17 Console.WriteLine("生产了一批‘ml实惠家庭版’柔顺洗发水!");
18 }
19 }
20 }
21  

 

 

存在问题:

1)     代码重用性很差,洗发水的生产流程是一样的,分别是原料加工、包装生产、添加赠品。可以进行提取、封装。

2)        不满足开-闭原则,扩展性太差。每次生产不同的产品只能修改Shampoo的构造器,而采用对构造器进行硬性编码也很难以实现对产品的管理。

2.纳阶段

思路:使用生成器模式,将洗发水的构造过程从创建洗发水的类中分离出来,把生产洗发水的过程划分成细小的步骤,使程序更加精细,这样就可以有效地控制整个对象的构造。抽象出一个生成器接口定义每一步骤的抽象方法,整个构造过程封装在具体的生成器中,用户根据不同的生成器就可以生产出相应要求的洗发水。

类结构图: 

 

代码浏览:

 

代码
1 /// <summary>
2 /// 生成器接口
3 /// </summary>public interface Buider
4 {
5 void buildMaterial();
6
7 void buildPackage();
8
9 void buildGift();
10
11 NewShampoo getShampoo();
12 }
13
14 /// <summary>
15 /// 洗发水
16 /// </summary>
17 public class NewShampoo
18 {
19 }
20
21 /// <summary>
22 /// 柔顺型洗发水生成器
23 /// </summary>
24 public class SmoothIntenseBuilder : Buider
25 {
26 NewShampoo newShampoo;
27 public SmoothIntenseBuilder()
28 {
29 newShampoo = new NewShampoo();
30 }
31
32
33 #region Buider 成员
34
35 public void buildMaterial()
36 {
37 Console.WriteLine("生产了去屑洗发水原料");
38 }
39
40 public void buildPackage()
41 {
42 Console.WriteLine("生产了去屑洗发水包装,红色装ml");
43 }
44
45 public void buildGift()
46 {
47 throw new Exception("The method or operation is not implemented.");
48 }
49
50 public NewShampoo getShampoo()
51 {
52 buildMaterial();
53 buildPackage();
54 Console.WriteLine("生产了一批‘ml实惠家庭版’柔顺洗发水!");
55 return newShampoo;
56 }
57 #endregion
58 }
59
60 /// <summary>
61 /// 去屑型洗发水生成器
62 /// </summary>
63 public class AntiDandruffBuilder : Buider
64 {
65 NewShampoo newShampoo;
66
67 public AntiDandruffBuilder() {
68 newShampoo = new NewShampoo();
69 }
70 #region Buider 成员
71
72 public void buildMaterial()
73 {
74 Console.WriteLine("生产了去屑洗发水原料");
75 }
76
77 public void buildPackage()
78 {
79 Console.WriteLine("生产了去屑洗发水包装,蓝色装ml");
80 }
81
82 public void buildGift()
83 {
84 Console.WriteLine("添加赠品,ml柔顺洗发水瓶");
85 }
86 public NewShampoo getShampoo()
87 {
88 buildMaterial();
89 buildPackage();
90 buildGift();
91 Console.WriteLine("生产了一批‘买ml送特惠装’去屑洗发水!");
92 return newShampoo;
93 }
94 #endregion
95 }
96
97 /// <summary>
98 /// 指挥者类
99 /// </summary>
100 public class Director
101 {
102 public Director(Buider b)
103 {
104 buider = b;
105 }
106
107
108 Buider buider;
109
110
111 public NewShampoo constructProduct()
112 {
113 return buider.getShampoo();
114 }
115 }
116

 

 

 

设计体会:

生成器模式将对象的构造过程封装在具体生产器中,用户使用不同的具体生成器就可以得到该对象的不同表示;

生产器模式将对象的构造过程从创建该对象的类中分离出来,使用户无须了解该对象的具体组件;

可以更加精细有效地控制对象的构造过程。生成器将对象的构造器过程分解成若干步骤,这就使程序可以更加精细,有效地控制整个对象的构造。

当增加新的具体生成器时,不必修改指挥者的代码,即该模式满足开-闭原则。

3.验证阶段

当前目标:增加一个新的产品特征维度,证明该模式的适用性;

类结构图:

 

验证代码:

 

代码
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
">------------------------未用模式前------------------------<");
Shampoo s
= new Shampoo("AntiDandruff");
Console.WriteLine();
Shampoo s1
= new Shampoo("SmoothIntense");
Console.WriteLine(
">----------------------------------------------------------<");

Console.WriteLine(
">-------------------------使用模式-------------------------<");
Buider builder
= new AntiDandruffBuilder();
Director dir
= new Director(builder);
NewShampoo antiDandruffShampoo
= dir.constructProduct();//生产去屑洗发水
Console.WriteLine();
builder
= new SmoothIntenseBuilder();
dir
= new Director(builder);
NewShampoo smoothIntenseShampoo
= dir.constructProduct();//生产柔顺洗发水

builder
= new BalanceBuider();
dir
= new Director(builder);
NewShampoo BalanceShampoo
= dir.constructProduct();//生产控油洗发水
Console.WriteLine(">----------------------------------------------------------<");


}
}

 s

posted @ 2010-11-30 17:02  天津城建学院软件工程  阅读(392)  评论(0编辑  收藏  举报