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)的更多相关文章

  1. 设计模式(四)建造者模式 Builder

    Builder: <Effective Java> 第2条:遇到多个构造器参数时要考虑用构建器. 建造者模式(Builder Pattern),也称生成器模式,定义如下: 将一个复杂对象的 ...

  2. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  3. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  4. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  5. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  6. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  7. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  8. 建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...

  9. Net设计模式实例之建造者模式(Builder Pattern)

    一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...

  10. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

随机推荐

  1. sigemptyset,sigfillset,sigaddset,sigdelset,sigismember,sigprocmask,sigpendmask作用

    SYNOPSIS #include <signal.h> int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); in ...

  2. #include <NOIP2009 Junior> 细胞分裂 ——using namespace wxl;

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  3. 【Ext.Net学习笔记】05:Ext.Net GridPanel的用法(包含Filter、Sorter、Grouping、汇总(Summary)的用法)

    GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: <ext:GridPanel runat="server&qu ...

  4. css3中box-flex的使用

    语法: box-flex:<number> 其中number取值:使用浮点数指定对象所分配其父元素剩余空间的比例.设置或检索伸缩盒对象的子元素如何分配其剩余空间. html代码: < ...

  5. mac os利用xampp实现apache下的cgi

    折腾了两天终于把问题解决了,mac os是10.10.3..够新了吧 系统原生的apache配置cgi老是配不好,突然发现xampp也有macos版的,准备下下来试试. 安装完成后,打开apache服 ...

  6. Android组件---四大布局的属性详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4372222.html Android常见布局有下面几种: LinearL ...

  7. iOS宏定义

    1.__OBJC__宏定义作用 在.pch 文件中一般都会自动加上这句宏定义,表示宏内引用的文件确保只被使用Objective-C语言的文件所引用,保证引用关系的清晰.因为在一个OC工程中,可能包含. ...

  8. zabbix架构

    监控系统: 数据的采集---存储---展示和分析---报警 snmp           cacti:rrd agent           nagios:不保存数据,mysql icmp/ssh   ...

  9. Linux Linux程序练习九

    题目:利用多线程与有名管道技术,实现两个进程之间发送即时消息,实现聊天功能 思路:关键在于建立两个有名管道,利用多线程技术,进程A中线程1向管道A写数据,进程B中线程2从管道A读数据,进程A线程2从管 ...

  10. 卫星轨道和两行数据TLE

    最近由于Sino-2和北斗的关系,很多网友贴了表示卫星运行轨道的TLE数据.这里想对卫星轨道参数和TLE的格式做一个简单介绍.虽然实际上没有人直接读TLE数据,而都是借助软件来获得卫星轨道和位置信息, ...