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

结构图(Struct):    
               

协作(Collaborations):
                  

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

1  public abstract class Builder
 2     {
 3         public abstract void BuildDoor();
 4         public abstract void BuildWall();
 5         public abstract void BuildWindows();
 6         public abstract void BuildFloor();
 7         public abstract void BuildHouseCeiling();
 8     
 9         public abstract House GetHouse();
10     }

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

1 public class Director
 2     {
 3       public void Construct(Builder builder)
 4       {
 5           builder.BuildWall();
 6           builder.BuildHouseCeiling();          
 7           builder.BuildDoor();
 8           builder.BuildWindows();
 9           builder.BuildFloor();         
10       }
11     }

ChineseBuilder类

1    public class ChineseBuilder:Builder
 2     {
 3        private House ChineseHouse = new House();
 4         public override void BuildDoor()
 5         {
 6             Console.WriteLine("this Door 's style of Chinese");
 7         }
 8         public override void BuildWall()
 9         {
10             Console.WriteLine("this Wall 's style of Chinese");
11         }
12         public override void BuildWindows()
13         {
14             Console.WriteLine("this Windows 's style of Chinese");
15         }
16         public override void BuildFloor()
17         {
18             Console.WriteLine("this Floor 's style of Chinese");
19         }
20         public override void BuildHouseCeiling()
21         {
22             Console.WriteLine("this Ceiling 's style of Chinese");
23         }
24         public override House GetHouse()
25         {
26             return ChineseHouse;
27         }
28     }

RomanBuilder类:

1     class RomanBuilder:Builder
 2     {
 3         private House RomanHouse = new House();
 4         public override void BuildDoor()
 5         {
 6             Console.WriteLine("this Door 's style of Roman");
 7         }
 8         public override void BuildWall()
 9         {
10             Console.WriteLine("this Wall 's style of Roman");
11         }
12         public override void BuildWindows()
13         {
14             Console.WriteLine("this Windows 's style of Roman");
15         }
16         public override void BuildFloor()
17         {
18             Console.WriteLine("this Floor 's style of Roman");
19         }
20         public override void BuildHouseCeiling()
21         {
22             Console.WriteLine("this Ceiling 's style of Roman");
23         }
24         public override House GetHouse()
25         {
26             return RomanHouse;
27         }
28     }

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

1   public class Client
 2     {
 3         public static void Main(string[] args)
 4         {
 5             Director director = new Director();
 6 
 7             Builder instance;
 8 
 9             Console.WriteLine("Please Enter House No:");
10 
11             string No = Console.ReadLine();
12 
13             string houseType = ConfigurationSettings.AppSettings["No" + No];
14 
15             instance = (Builder)Assembly.Load("House").CreateInstance("House." + houseType);
16 
17             director.Construct(instance);
18 
19             House house= instance.GetHouse();
20             house.Show();
21 
22             Console.ReadLine();
23         }
24     }

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3   <appSettings>
4     <add key="No1" value="RomanBuilder"></add>
5     <add key="No2" value="ChineseBuilder"></add>
6   </appSettings>
7 </configuration>

Builder模式的几个要点:

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

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

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

13建造者模式(Builder)相关推荐

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

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

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

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

  3. Android设计模式之建造者模式builder

    今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...

  4. 创建型设计模式之建造者模式(Builder)

    结构 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不 ...

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

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

  6. 大话设计模式--建造者模式 Builder -- C++实现实例

    1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了. 关键类Directo ...

  7. 一天一个设计模式之建造者模式(Builder)

    建造者模式,属于创建型模式,其目的在于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用情况: • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. ...

  8. Activiti源码之建造者模式 Builder

    建造者模式介绍 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类 ...

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

    建造者模式原理:建造模式主要是用于产生对象的各个组成部分,而抽象工厂模式则用于产生一系列对象,建造者模式而且要求这些对象的组成部分有序. 代码如下: #include <iostream> ...

最新文章

  1. 《新程序员003》来了!华为、阿里等 30+ 公司的云原生及数字化实战经验!
  2. js之数据类型及类型转换
  3. 关于引入 js 文件
  4. Java基础 系统注解 @Override @Deprecated @SuppressWarnings 使用的方法及原因
  5. 实战四 win2008 r2 AD中大批量添加用户账号
  6. python xlwt 解决报错:ValueError: More than 4094 XFs (styles)
  7. mysql用户增删改
  8. Toast-Android 专属浮动小提示
  9. CvvImage.h和CvvImage.cpp
  10. Python使用matplotlib可视化模拟烧烤摊每月营业额折线图
  11. 解决前端跨域的八种方案
  12. php找100到1000之间的素数_php编程输出100以内的素数
  13. Windows 2000 检测系统安全进阶详解
  14. 王者战力查询接口(免费)
  15. Boom 3D 1.2.2 特别版 Mac 3D环绕音效增强工具
  16. 从零开始的基于百度大脑EasyData的多人协同数据标注
  17. 十分钟搭建自己的QA问答社区
  18. ThinkPad开启、禁用触摸板
  19. 商人过河c语言编程,商人过河问题C语言源码.c
  20. html的入门——从标签开始(2)

热门文章

  1. bzoj3203: [Sdoi2013]保护出题人
  2. git reflog and checkout
  3. php开发客服系统(持久连接+轮询+反向ajax)
  4. SqlServer按时间自动生成生成单据编号
  5. 线段树(单点更新(模板)) 之 hdu 1166
  6. 基于Passthru的NDIS开发的个人理解
  7. 【转】C#中Invoke的用法
  8. sharepoint2010的弹出等待提示的对话框
  9. C# 线程手册 第三章 使用线程 Monitor.TryEnter()
  10. Ajax Extensions核心控件介绍