[设计模式]第四回:建造者模式(Builder Pattern)
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.小结
客户端不了解具体的制作过程,产品的细节制作被封装隔离,买个汽车,可以关心汽车的各个部件是不是好的,但是没必要知道这个东西怎么建造的。
产品的部分建造可以灵活控制,配料的多少可以制作出不同的产品,如果步骤细分还可以出更多产品,如面料多少可以分大碗 小碗 中碗。
[设计模式]第四回:建造者模式(Builder Pattern)的更多相关文章
- 设计模式(四)建造者模式 Builder
Builder: <Effective Java> 第2条:遇到多个构造器参数时要考虑用构建器. 建造者模式(Builder Pattern),也称生成器模式,定义如下: 将一个复杂对象的 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...
- Net设计模式实例之建造者模式(Builder Pattern)
一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
随机推荐
- Azure CDN 启用HTTPS
默认情况下,订阅里的CDN不支持HTTPS 需要联系21v,提交工单告知订阅号,由后台为订阅启用CDN的HTTPS功能. 然后就可以在创建CDN时选到HTTPS的选项了.
- [转]Flash ActionScript2.0面向对象游戏开发-推箱子
本文转自:http://www.alixixi.com/Dev/W3C/Flash/2007/2007070868666.html 概述: Flash ActionScript2.0是一种面向对向的编 ...
- 两种动态加载JavaScript文件的方法
两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...
- notepad++下的字体设置
设置 - 语言格式设置 中
- AC日记——津津的储蓄计划 P1089 (水!)
题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里 ...
- 正则基础之——环视(Lookaround)
环视基础 环视只进行子表达式的匹配,不占有字符,匹配到的内容不保存到最终的匹配结果,是零宽度的.环视匹配的最终结果就是一个位置. 环视的作用相当于对所在位置加了一个附加条件,只有满足这个条件,环视子表 ...
- 介绍Git版本控制器的使用
Git 简介 Git 是什么?大家肯定会说不就是版本控制器嘛,是的Git是目前世界上最先进的分布式版本控制系统(没有之一). 1.那什么是版本控制器呢? 举个简单的例子,比如我们用Word写文章,那你 ...
- OXM
O/X Mapper 是什么? Spring 3.0 的一个新特性是 O/X Mapper.O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML.它的目的是在 Java 对象(几乎 ...
- ueditor集成自己的ImageServer时出现错误的原因分析
1.场景:应用是一个独立的站点,ImageServer是一个独立的站点,因此存在跨域的问题. 2.遇到的详细错误“网络链接错误,请检查配置后重试!” 我使用uploadify测试是没问题的.使用ued ...
- wireshark排查打印机问题
抓包工具排除故障 前言:上网慢,可能是内网堵了.装上wireshark,可抓到广播包,多播包,以及发给自己的包.如果想抓lan内其他人之间的通信包,那就要在sw上做端口镜像. 背景 调试打印机的人发现 ...