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.小结

客户端不了解具体的制作过程,产品的细节制作被封装隔离,买个汽车,可以关心汽车的各个部件是不是好的,但是没必要知道这个东西怎么建造的。

产品的部分建造可以灵活控制,配料的多少可以制作出不同的产品,如果步骤细分还可以出更多产品,如面料多少可以分大碗 小碗 中碗。

最新文章

  1. asp.net读取模版并写入文本文件
  2. 关于Redis数据过期策略
  3. css3属性-webkit-font-smoothing
  4. BZOJ 2627 JZPKIL
  5. BZOJ 2151 种树
  6. MySQL基本配置
  7. session.createQuery()不执行和java.lang.reflect.InvocationTargetException
  8. SE 2014年4月3日
  9. (实用篇)使用PHP生成PDF文档
  10. python爬虫解决gbk乱码问题
  11. 利用Python代码编写计算器小程序
  12. ThinkPHP 中使用 IS_AJAX 判断原生 JS 中的 Ajax 出现问题
  13. vim 自动添加作者、版权、修改时间等信息
  14. centos7优化启动项,关闭一些不必要开启的服务
  15. Go 初体验 - channel.2 - 超时机制
  16. MYSQL存储过程实现用户登录
  17. orcale 函数wm_concat不存咋lob值使用zh_concat 替换
  18. Photoshop Keynote
  19. 1082. Read Number in Chinese (25)-字符串处理
  20. Valid Parentheses &amp; Longest Valid Parentheses

热门文章

  1. hdu 2874 Connections between cities [LCA] (lca-&gt;rmq)
  2. 数据库配置文件 conf.properties
  3. Web性能优化之图片延迟加载
  4. Hog SVM 车辆 行人检测
  5. 矩阵乘法 codevs 1287 矩阵乘法
  6. OpenCV 之 数字图像
  7. 【实践】获取CKEditor的html文本、纯文本、被选中的内容及赋值
  8. 2014 Super Training #1 F Passage 概率DP
  9. MySQL数据库学习笔记(二)----MySQL数据类型
  10. [反编译U3D]Decompile Unity Resources