[设计模式]第四回:建造者模式(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:鸡 ...
随机推荐
- Linux下Mysql安装
1.下载安装包 首先查看Linux版本: [root@localhost ~]# lsb_release -a LSB Version: :core-4.0-amd64:core-4.0-noarch ...
- [转]PhoneGap使用PushPlugin插件实现消息推送
本文转自:http://my.oschina.net/u/1270482/blog/217661 http://devgirl.org/2013/07/17/tutorial-implement-pu ...
- 边工作边刷题:70天一遍leetcode: day 75-1
Shortest Word Distance I/II/III 要点:系列题最重要的是记清题,重点是题目本身的变化和解法之间的关联. I https://repl.it/CqPf 这题的一般规律从左到 ...
- HDU 4445 Crazy Tank --枚举
题意: n个物体从高H处以相同角度抛下,有各自的初速度,下面[L1,R1]是敌方坦克的范围,[L2,R2]是友方坦克,问从某个角度抛出,在没有一个炮弹碰到友方坦克的情况下,最多的碰到敌方坦克的炮弹数. ...
- HDU 2065 “红色病毒”问题 --指数型母函数
这种有限制的类棋盘着色问题一般可以用指数型母函数来解决,设Hn表示这样的着色数,首先H0=1,则Hn等于四个字母的(A,B,C,D)的多重集合的n排列数,其中每个字母的重数是无穷,且要求A,C出现的次 ...
- AC日记——斗地主(dfs)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- java 21 - 2 字符输出流
字符输出流:OutputStreamWriter 构造方法:一共4个,说2个常用的 A:OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流 ...
- Spring Mvc 在非controller层 实现获取request对象
一般我们在Controller层,会编写类似这样的方法 @Controller @RequestMapping(value="/detail") public class GetU ...
- setAttribute改变属性,动态改变类
<style type="text/css"> .box{color:red;} </style> <div>通过setAttribute添加d ...
- 携手K2 BPM,华住酒店完美实现“互联网+”转型
华住酒店集团,旗下6大品牌酒店,包括商旅品牌—禧玥酒店.全季酒店.星程酒店.汉庭酒店.海友酒店,以及度假品牌—漫心度假酒店.高端大气上档次一气呵成,2013年签约K2,携手成就美好生活. 演讲人:宋洪 ...