1.概述
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,这就是建造者模式。
简单的说就是生产一个产品的步骤比较稳定,单个步骤变化会产生一个不同的产品。
2.实践
物理模型
建造者模式的例子很多,如肯德基套餐,游戏角色人物等等。前一段时间同事辞职去开了一家米线店,开张时我们这些同事都去捧场了,免费午餐,随我们点,菜单发现并不多,只有几种类型的米线,酸辣米线,杂酱米线。
谈话中米线做法,他说相当简单,一开始慢慢试,调出味道,成熟后然后把各个配料的量纪录下来,这样就成为一道米线了,下次直接按照配料量一一加入 即可,各种配料都在这了,就这么多,只是每种配料的量不同,配出不一样的米线。
先定义一个米线产品,成品米线由好多部分组成的
/// <summary> /// 米线产品 /// </summary> public class NoodlesProduct { List<string> parts = new List<string>(); public void AddPart(string part) { parts.Add(part); } /// <summary> /// 展示 米线产品 /// </summary> public void Show() { foreach (var p in parts) { Console.WriteLine(p); } } }
接下来就要开始做米线了,米线做的过程都差不多,只是放料多少有所不同,先抽象一个做米线的接口如下:
/// <summary> /// 建造者:这里是用来做米线,假设米线由下面3个部分组成 /// </summary> public interface IBuilder { /// <summary> /// 米线主料 /// </summary> void BuilderNoodles(); /// <summary> /// 酸辣料 /// </summary> void BuilderHotSour(); /// <summary> /// 肉酱料 /// </summary> void BuiderMeat(); /// <summary> /// 获取成功的米线产品 /// </summary> NoodlesProduct GetNoodles(); }
来个具体的实现,做个酸辣米线
/// <summary> /// 酸辣米线制作类 /// </summary> public class BuilderHotSour : IBuilder { NoodlesProduct noodles = new NoodlesProduct(); /// <summary> /// 主料 /// </summary> public void BuilderNoodles() { noodles.AddPart("加入米线及油盐味精"); } /// <summary> /// 放酸辣 /// </summary> public void BuilderHotSour() { noodles.AddPart("加入适量辣椒及醋"); } /// <summary> /// 肉酱料 /// </summary> public void BuiderMeat() { noodles.AddPart("加入少量肉酱"); } public NoodlesProduct GetNoodles() { return noodles; } }
再来个肉酱米线,类似
/// <summary> /// 肉酱米线制作类 /// </summary> public class BuilderMeat : IBuilder { NoodlesProduct noodles = new NoodlesProduct(); /// <summary> /// 主料 /// </summary> public void BuilderNoodles() { noodles.AddPart("加入米线及油盐味精"); } /// <summary> /// 放酸辣 /// </summary> public void BuilderHotSour() { noodles.AddPart("加入微量辣椒及醋或者不加"); } /// <summary> /// 肉酱料 /// </summary> public void BuiderMeat() { noodles.AddPart("加入适量肉酱"); } public NoodlesProduct GetNoodles() { return noodles; } }
接下来就是开始客户点餐要告诉客服或者厨师 要什么米线了,做米线都是他们来控制的,他们是一个指导者的角色
/// <summary> /// 指挥者(前台/或者厨师) /// </summary> public class Director { public void Construct(IBuilder builder) { builder.BuilderNoodles(); builder.BuilderHotSour(); builder.BuiderMeat(); } }
用户点餐过程如下:
public class MainClient { public void Main() { //客服人员 Director director = new Director(); //用户点餐是 酸辣米线 IBuilder builder = new BuilderHotSour(); //客服人员告诉厨师开始做米线 director.Construct(builder); //米线 做好 NoodlesProduct nooodels = builder.GetNoodles(); //用户得到米线,可验证米线是否少了料 nooodels.Show(); } }
3.小结
客户端不了解具体的制作过程,产品的细节制作被封装隔离,买个汽车,可以关心汽车的各个部件是不是好的,但是没必要知道这个东西怎么建造的。
产品的部分建造可以灵活控制,配料的多少可以制作出不同的产品,如果步骤细分还可以出更多产品,如面料多少可以分大碗 小碗 中碗。
作者:Qlin
出处:http://www.cnblogs.com/qqlin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。