[设计模式]第四回:建造者模式(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:鸡 ...
随机推荐
- mysql中count(),group by使用
count()统计表中或数组中记录 count(*)返回检索行的数目,且不论其值中是否包含NULL count(column_name)返回的是对列中column_name不为NULL的行的统计 例如 ...
- Genesis 2.8-2.12
And the LORD God planted a garden eastward in Eden; and there he put the man whom he had formed. 9 A ...
- activiti自定义流程之整合(三):整合自定义表单创建模型
本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单 ...
- Mango Weekly Training Round #3 解题报告
A. Codeforces 92A Chips 签到题.. #include <iostream> #include <cstdio> #include <cstring ...
- Git版本控制工具(一)----git的安装及创建版本库
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android配置----Android开发环境搭建
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- JMeter学习(十四)JMeter监控Tomcat性能
使用jmeter的tomcat监视器功能,可以通过向tomcat的status页面发送get请求,得到资源使用信息,然后转换为只直观的图像方式,这样的话,就可以监视到服务器的资源使用情况,不过需要注意 ...
- Win2003_IIS+PHP+MYSQL 全能服务器配置
WIN2003_IIS+PHP+mysql最新版_全能服务器配置 本次配置PHP的服务器环境:Windows2003+IIS6+ASP+PHP5+MySQL5整个配置过程需要是使用拥有管理员权限的系统 ...
- Lua笔记(1)
今天开始学习Lua,下面把一些重点记下来: 单行注释-- ,多行注释 --[[ ....... --]] Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真. Lua没 ...
- Java连接Elasticsearch集群
package cn.test; import java.net.InetAddress; import java.net.UnknownHostException; import org.elast ...