将一个复杂的构建与其表示相分离,使得一样的构建过程能够建立不一样的表示,这就是建造者模式。ide
简单的说就是生产一个产品的步骤比较稳定,单个步骤变化会产生一个不一样的产品。ui
物理模型spa
建造者模式的例子不少,如肯德基套餐,游戏角色人物等等。前一段时间同事辞职去开了一家米线店,开张时咱们这些同事都去捧场了,免费午饭,随咱们点,菜单发现并很少,只有几种类型的米线,酸辣米线,杂酱米线。code
谈话中米线作法,他说至关简单,一开始慢慢试,调出味道,成熟后而后把各个配料的量纪录下来,这样就成为一道米线了,下次直接按照配料量一一加入 便可,各类配料都在这了,就这么多,只是每种配料的量不一样,配出不同的米线。blog
先定义一个米线产品,成品米线由好多部分组成的接口
/// <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(); }
来个具体的实现,作个酸辣米线string
/// <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; } }
接下来就是开始客户点餐要告诉客服或者厨师 要什么米线了,作米线都是他们来控制的,他们是一个指导者的角色it
/// <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(); } }
客户端不了解具体的制做过程,产品的细节制做被封装隔离,买个汽车,能够关心汽车的各个部件是否是好的,可是不必知道这个东西怎么建造的。
产品的部分建造能够灵活控制,配料的多少能够制做出不一样的产品,若是步骤细分还能够出更多产品,如面料多少能够分大碗 小碗 中碗。