Builder模式的缘起:
    假设创建游戏中的一个房屋House设施,该房屋的构建由几部分组成,且各个部分富于变化。如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正.....
动机(Motivation):
    在软件系统中,有时候面临一个"复杂对象"的创建工作,其通常由各个部分的子对象用一定算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合到一起的算法却相对稳定。
    如何应对这种变化呢?如何提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化,从而保持系统中的"稳定构建算法"不随需求的改变而改变?
意图(Intent):
    将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
                                              -------《设计模式》GOF

结构图(Struct):    
               

协作(Collaborations):
                  

生活中的例子:
             
适用性:
    
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    2.当构造过程必须允许被构造的对象有不同的表示时。
实例代码:

Builder类:

    public abstract class Builder
{
public abstract void BuildDoor();
public abstract void BuildWall();
public abstract void BuildWindow();
public abstract void BuildFloor();
public abstract void BuildHouseCeiling();
public abstract House GetHouse();
}

Director类:这一部分是 组合到一起的算法(相对稳定)。

        public void Constract(Builder builder)
{
builder.BuildWall();
builder.BuildHouseCeiling();
builder.BuildDoor();
builder.BuildWindow();
builder.BuildFloor();
}

ChineseBuilder类

    public class ChineseBuilder: Builder
{
private House ChineseHouse = new House(); public override void BuildDoor()
{
Console.WriteLine("this Door 's style of Chinese");
} public override void BuildWall()
{
Console.WriteLine("this Wall 's style of Chinese");
} public override void BuildWindow()
{
Console.WriteLine("this Windows 's style of Chinese");
} public override void BuildFloor()
{
Console.WriteLine("this Floor 's style of Chinese");
} public override void BuildHouseCeiling()
{
Console.WriteLine("this Ceiling 's style of Chinese");
} public override House GetHouse()
{
return ChineseHouse;
}
}
RomanBuilder类:
    public class RomanBuilder:Builder
{
private House RomanHouse = new House();
public override void BuildDoor()
{
Console.WriteLine("this Door 's style of Roman");
} public override void BuildWall()
{
Console.WriteLine("this Wall 's style of Roman");
} public override void BuildWindow()
{
Console.WriteLine("this Windows 's style of Roman");
} public override void BuildFloor()
{
Console.WriteLine("this Floor 's style of Roman");
} public override void BuildHouseCeiling()
{
Console.WriteLine("this Ceiling 's style of Roman");
} public override House GetHouse()
{
return RomanHouse;
}
}

House类

    public class House
{
public void Show()
{
Console.WriteLine("House");
}
}

ChineseBuilder和RomanBuilder这两个是:这个复杂对象的两个部分经常面临着剧烈的变化。

    class Program
{
static void Main(string[] args)
{
Director director = new Director(); Builder instance; Console.WriteLine("Please Enter House No:"); string no = Console.ReadLine(); string houseType = ConfigurationSettings.AppSettings["No" + no]; Assembly ass = Assembly.GetExecutingAssembly(); Type type = ass.GetType(ass.GetName().Name + ".FactoryMethod." + houseType); object obj_builder = Activator.CreateInstance(type); instance = (Builder)obj_builder; director.Constract(instance); House house = instance.GetHouse(); house.Show(); Console.ReadLine();
}
}

配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="No1" value="RomanBuilder"></add>
<add key="No2" value="ChineseBuilder"></add>
</appSettings>
</configuration>
Builder模式的几个要点:

Builder模式 主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的乘法,而复杂对象的各个部分则经常变化。

Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。

Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder械通常和Composite模式组合使用。

3.建造者模式(Builder)的更多相关文章

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

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

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

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

  3. 建造者模式(Builder)-宏观的使用角度

    建造者模式(Builder) 建造者模式是用来解决产品对象的创建过程是由多个零件组成的情况,这些零件与产品本身是组合关系,也就是部分与整体,这些零件的创建顺序,还有一些创建中的逻辑,都是稳定的,可以封 ...

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

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

  5. 建造者模式(Builder Pattern)

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

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

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

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

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

  8. 建造者模式(Builder)——从组装电脑开始

    建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...

  9. 设计模式—建造者模式(Builder)

    title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...

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

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

随机推荐

  1. 浅析Android设备中grep命令处理流程

    2017-04-18   概述     在TV开发板中,可以在串口中直接使用grep命令.这是因为在/system/bin/下有一个'grep'链接.这个链接指向'/system/bin/toolbo ...

  2. springMVC整理01--搭建普通的工程

    1. Spring MVC 简介Spring MVC 是 Spring 基于 MVC 设计理念提供的一个表现层的 Web 框架.是目前主流的MVC 框架之一.Spring MVC 通过一套 MVC 注 ...

  3. Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ

    因为需要用 C++ 实现联机对战的功能,但是不想直接用 winsock ,因此选了ZMQ 框架(不知道合不合适).安装的过程还是挺艰辛的.但是也学到了些东西,记录一下.另外,Zmq 的作者 Piete ...

  4. 【BZOJ2618】[CQOI2006]凸多边形(半平面交)

    [BZOJ2618][CQOI2006]凸多边形(半平面交) 题面 BZOJ 洛谷 题解 这个东西就是要求凸多边形的边所形成的半平面交. 那么就是一个半平面交模板题了. 这里写的是平方的做法. #in ...

  5. Centos7之Gcc安装

    1下载Gcc包进行安装https://gcc.gnu.org 下载下来的是一个包文件,但是要进行一系列的编译安装,听麻烦的. 不如直接使用这个yum来从网络上进行安装. 2 yumyum instal ...

  6. [NOI2010]航空管制(拓扑排序+贪心)

    题目描述 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上,小X不幸又一 ...

  7. 从Java的角度简单修复Cookie越权漏洞

    技术实在是有限,讲解cookie越权的时候可能有点简单和粗糙.这里就简单记录学习下. 首先自己写一段存在漏洞的代码code: sendCookie.java package cookie; impor ...

  8. 用Python计算幂的两种方法,非递归和递归法

    用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...

  9. nodejs的某些api~(一)node的流1

    根据心情整理一些node的api~ 今天第一篇,node的流:node的流比较重要,node的流存在于node的各个模块,包括输入输出流,stdin,stout.fs读取流,zlib流,crypto流 ...

  10. 洛谷P4219 大融合

    LCT新姿势:维护子树信息. 不能带修,子树修改就要toptree了... 题意:动态加边,求子树大小. 解: 维护子树信息只要额外维护虚边连的儿子的信息即可.这里把siz的定义变成子树大小. 哪里会 ...