设计模式:建造者模式(Builder)
定 义:将一个复杂对象的构建与它的表示分离,使得同一构建过程可以创建不同的表示。
结构图:

产品类:
class Product
{
//部件集合
List<string> parts = new List<string>(); /// <summary>
/// 添加部件
/// </summary>
/// <param name="part"></param>
public void Add(string part)
{
parts.Add(part);
} public void Show()
{
Console.WriteLine("\n 产品 创建--------");
foreach (var part in parts)
{
Console.WriteLine(part);
}
}
}
抽象建造者类:
abstract class Builder
{
public abstract void BuilderPartA(); //组装部件1
public abstract void BuilderPartB(); //组装部件2
public abstract Product GetResult(); //返回组装好的产品
}
具体建造者类:
/// <summary>
/// 具体建造者类1
/// </summary>
class ConcreteBuilder1 : Builder
{
private Product product = new Product(); public override void BuilderPartA()
{
product.Add("部件A");
} public override void BuilderPartB()
{
product.Add("部件B");
} public override Product GetResult()
{
return product;
}
} /// <summary>
/// 具体建造者类2
/// </summary>
class ConcreteBuilder2 : Builder
{
private Product product = new Product(); public override void BuilderPartA()
{
product.Add("部件X");
} public override void BuilderPartB()
{
product.Add("部件Y");
} public override Product GetResult()
{
return product;
}
}
指挥者类:
class Director
{
public void Construct(Builder builder)
{
builder.BuilderPartA();
builder.BuilderPartB();
}
}
客户端代码:
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2(); director.Construct(b1); //指挥者用ConcreteBuilder1的方法来创建产品
Product p1 = b1.GetResult();
p1.Show(); director.Construct(b2); //指挥者用ConcreteBuilder2的方法来创建产品
Product p2 = b2.GetResult();
p2.Show();
优点:
•用户只需要指定要建造的类型就可以得到它们,而具体的建造过程和细节不需要知道。
•建造代码与表示相分离,如果要改变一个产品的内部表示,只要再定义一个新的具体的建造者就可以了。
•建造过程由指挥者来控制,建造细节由一个抽象类来控制,对于实现建造细节的具体类来说,不会遗漏某一个步骤。
缺点:
•产品的构造组件被定义在Builder,增加新的产品的一个细节需要修改Builder,违背了“开闭原则”。
应用情景:
•当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
•当复杂对象的部件相对稳定,不会发生变化时。
设计模式:建造者模式(Builder)的更多相关文章
- 设计模式—建造者模式(Builder)
title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- 设计模式--建造者模式Builder(创建型)
一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...
- 说说设计模式~建造者模式(Builder)
返回目录 建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我 ...
- 大话设计模式--建造者模式 Builder -- C++实现实例
1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了. 关键类Directo ...
- 设计模式:建造者模式(Builder)
流水作业大家应该都清楚吧!在流水作业中,我们可以将一些复杂的东西给构建出来,例如汽车.我们都知道汽车内部构件比较复杂,由很多部件组成,例如车轮.车门.发动机.方向盘等等,对于我们用户来说我们并不需要知 ...
- 设计模式 - 建造者模式 Builder Pattern
简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ...
- [工作中的设计模式]建造者模式builder
一.模式解析 建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心. 以上是对建造者模式的官方定义,简单说就是对于复杂对象 ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
随机推荐
- java.lang.RuntimeException: Invalid action class configuration that references an unknown class named [xxxAction]。
java.lang.RuntimeException: Invalid action class configuration that references an unknown class name ...
- BZOJ3823 : 定情信物
n维超立方体有$2^{n-i}C_n^i$个i维元素,于是$O(n)$预处理出1到n的逆元,再$O(n)$计算即可. 注意Trick:P可能小于n,所以要将数字表示成$a\times P^b$的形式. ...
- 一份spring配置文件及其详解
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/axu20/archive/2009/10/14/4668188.aspx 1.基本配置:<?xml versio ...
- Noi 2016
考砸只能说自己弱 Noi不是生活的全部, 人们也不会永远止步于失败. 大家加油 可以+我的qq:582744883
- 使用Python中的urlparse、urllib抓取和解析网页(一)(转)
对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...
- Android jni开发资料--NDK环境搭建
谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK.而在NDKr7开始,Google的Windows版的NDK ...
- 又一种Mysql报错注入
from:https://rdot.org/forum/showthread.php?t=3167 原文是俄文,所以只能大概的翻译一下 这个报错注入主要基于Mysql的数据类型溢出(不适用于老版本的M ...
- Css - 黑魔法
我们发现了一个新功能,现在你可以创建sticky块元素了.这和 fixed 块元素一样,但不同的是, sticky 块元素是不会遮挡另一个块元素的,最好看看demo 类似的功能实现还可以使用jquer ...
- vb.net-三种将datagridview数据导出为excel文件的函数
第一种方法较慢,但是数据格式都比较好,需要引用excel的 Microsoft.Office.Interop.Excel.dll office.dll #Region "导出excel函数 ...
- Key-Vlaue Coding Apple官方翻译
今天是键值编码,网上有很多文章,可以百度.不太理解的就看官方文档吧 键-值编码 键值编码是一种运用字符串标识符来间接访问一个对象的属性和关系的机制.它尤其强化并关联了多种Cocoa编程的机制和技术,体 ...