【朝花夕拾】设计模式之建造者模式
建造者模式简介
建造者模式又称生成器模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这就要求,我们所要处理的对象必须要有非常强的结构化特征,对于开发人员而言,需要抽象出一般的结构化接口出来,方便进行构建工作。
作为一名码农,最难得的应该就是找对象了,就算勉强找到了,要是对人家不好,人家可就离你远去了。所以要对人家好点,学会做饭,多弄几个花样出来,让生活充满新鲜感,小两口的感情也会越来越深了。
这个时候建造者模式就闪亮登场了,我们所吃的饭,无非是炒菜,主食,另外还需要弄汤类或者饮料类东西,只要将这些东西抽象出来,那么每天的饭菜内容就稳定了,永远变化的是具体的炒菜品类、主食品类和汤的品类。要始终谨记,稳定的东西都是抽象后的东西,不要一下子就陷入到细节中去。
建造者模式uml类图
通过uml类图,我们可以知道建造者模式有以下几个角色:
director:从抽象角度创建对象的各个部分,同时根据要求设计创建各个部分的顺序。
builder:给出一个抽象接口,以规范产品对象的各个组成部分的建造。
concretebuilder:实现builder接口,具体化创建对象的各个部分。 并提供具体的实例。
product:要创建的复杂对象。此处指的是meal。当然该类可以不用,只保留概念也是可以的。
范例
接下来的范例就是要为女朋友准备不同的饭菜,以达生活新鲜感的目的,要好好学哦。
1: public class meal
2: {
3: private string mainmeal;
4: private string stirfry;
5: private string soup;
6:
7: public meal(string mainmeal, string stirfry, string soup)
8: {
9: this.mainmeal = mainmeal;
10: this.stirfry = stirfry;
11: this.soup = soup;
12: }
13:
14: public void show(string mealtype)
15: {
16: console.writeline(mealtype);
17:
18: console.writeline("主食:" + this.mainmeal);
19: console.writeline("菜类:" + this.stirfry);
20: console.writeline("汤类:" + this.soup);
21: }
22: }
23:
24: public abstract class builder
25: {
26: public abstract void buildmainmeal(string mainmeal);
27:
28: public abstract void buildstirfry(string stirfry);
29:
30: public abstract void buildsoup(string soup);
31:
32: public abstract meal mealbuilder();
33: }
34:
35: public class breakfastbuilder : builder
36: {
37: private string mainmeal;
38: private string stirfry;
39: private string soup;
40:
41: public override void buildmainmeal(string mainmeal)
42: {
43: this.mainmeal = mainmeal;
44: }
45:
46: public override void buildstirfry(string stirfry)
47: {
48: this.stirfry = stirfry;
49: }
50:
51: public override void buildsoup(string soup)
52: {
53: this.soup = soup;
54: }
55:
56: public override meal mealbuilder()
57: {
58: return new meal(mainmeal, stirfry, soup);
59: }
60: }
61:
62: public class director
63: {
64: private builder builder;
65: public director(builder builder)
66: {
67: this.builder = builder;
68: }
69:
70: public void construct(string mainmeal, string stirfry, string soup)
71: {
72: builder.buildmainmeal(mainmeal);
73: builder.buildstirfry(stirfry);
74: builder.buildsoup(soup);
75: }
76: }
调用
1: class program
2: {
3: static void main(string[] args)
4: {
5: builder builder = new breakfastbuilder();
6: director director = new director(builder);
7: director.construct("八宝粥","香菇青菜","番茄鸡蛋汤");
8:
9: meal meal = builder.mealbuilder();
10:
11: meal.show("亲,吃早餐啦");
12: console.read();
13: }
14: }
运行结果:
当然,我这早餐,估计不过关的概率十分的大。
建造者模式优缺点
优点:
1、建造者模式有更好的封装性和细节隐藏的特点,调用者无需也无法关注到细节部分。
2、由于建造者对对象本身以及创建过程进行了非常细致的拆分,使得我们可以精细控制细节部分,减少风险。
缺点:
1、如果内部非常复杂的话,会生成太多太多的类,以至于会扩大我们的关注点,加大了代码的维护难度。
2、由于建造者模式本身很复杂,所以我们需要将建造者模式应用于通过环境下,不然只为了一种场景编写,实在是耗费精力,这也就带来了建造模式的使用范围。
建造者模式使用范围的思考
建造者模式要求我们使用抽象思维来面对问题,其建造过程与表示分离是其最大特征,如果建造过程可变,同时具有高度的结构化,我们使用建造者模式是非常有帮助的。
关于表示的功能,我们可以理解为,只是一个抽象接口,但是由于我们可以改变其构建顺序或者选择构建结构,使得表示可以多样化,此刻我们使用建造者模式也是有益的。