一、使用场景:

1、假设要创建一个House设施,该设施的创建由若干个部分组成,而且这若干个部分经常变化。

如果用最直观的设计方式,每一个房屋部分的变化,都将导致整个房屋结构的重新修正,但是这种设计方式,维护成本太高,而且如果对象极度复杂,那么很容易就会产生问题!

So,Builder  Pattern  is  userd to solve this   paogram!

2、意图

讲一个复杂对象的构建与表示相分离,使得同样的构建过程可以创建不同的表示。                                                                               ---设计模式《GOF》

3、抽象图

当软件的"主线"

比较稳定,当主线边上的枝枝叶叶变化频繁的话

4、Bulider模式的使用动机

在软件系统中,有时候面临这一个"复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个对象的子对象经常面临这剧烈的变化,但是将它们组合在一起的算法却非常的稳定。

那么如何应对这种变化?如何提供一种"封装机制"来隔离出复杂对象各个部分的变化,从而保证系统中的稳定构建算法不随需求的变化而变化?

5、Buidler模式的使用意图

将一个复杂的对象的构建过程与其表示相分离,使得同样的构建过程可以创建出不同的表示

6、具体案例

需求如下:一个抽象游戏系统,该系统的变化较慢(趋于稳定),该系统需要能构建不同风格的房屋,而且不同风格的房屋的组成部分(如门、窗)等能动态扩展.

代码如下:

    /// <summary>
/// Builder生成器模式(创建型模式)
/// </summary>
public class Builder
{ public class BuildSystem
{
public void Build(House house)
{
var houseTypeName = house.GetType().Name;
var houseInsantce=house.CreateHouse(houseTypeName);
}
} #region 抽象 /// <summary>
/// 房屋抽象
/// </summary>
public abstract class House
{
public abstract Window Window { get; set; } public abstract Door Door { get; set; } public abstract House CreateHouse(string builerTypeName);
} /// <summary>
/// 房屋生成器抽象
/// </summary>
public abstract class HouseBuilder
{
/// <summary>
/// 窗户构建方法
/// </summary>
/// <returns></returns>
public abstract void BuildWindow(); /// <summary>
/// 门构建方法
/// </summary>
/// <returns></returns>
public abstract void BuildDoor(); /// <summary>
/// 按照一定的逻辑组装构成部分,返回一个House实例
/// </summary>
/// <returns></returns>
public abstract House GetHouse();
} /// <summary>
/// 房屋构成一窗户抽象
/// </summary>
public abstract class Window { } /// <summary>
/// 房屋构成一门抽象
/// </summary>
public abstract class Door { } #endregion #region 具体实现 public class ModernHouse : House
{
public override Window Window { get; set; } public override Door Door { get; set; } public override House CreateHouse(string builerTypeName)
{
var builderTypeName = ConfigurationManager.AppSettings["ModernHouse"] as string;
//根据配置文件加载当前程序集获取传入风格房屋对应的Buider生成器类,生成对应的风格的房屋
var assembly = Assembly.LoadFile(@"F:\小超-基础框架\ZCBase\Demo\DesignMode\CreateDesginMode\bin\Debug\CreateDesginMode.exe");
var buildType = assembly.GetTypes().FirstOrDefault(f => f.Name.Equals(builderTypeName));
var instance = Activator.CreateInstance(buildType) as HouseBuilder;
var house = instance.GetHouse();
return house;
}
} public class ModernWindow : Window { } public class ModernDoor : Door { } /// <summary>
/// 现代化房屋构建方法
/// </summary>
public class ModernHouseBuilder : HouseBuilder
{
private ModernDoor _moderDoor; private Window _window; public override void BuildDoor()
{
_moderDoor=new ModernDoor();
} public override void BuildWindow()
{
_window = new ModernWindow();
} public override House GetHouse()
{
BuildDoor();
BuildWindow();
var modernHouse = new ModernHouse();
modernHouse.Door = _moderDoor;
modernHouse.Window = _window;
return modernHouse;
} } #endregion
}

配置文件代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="ModernHouse" value="ModernHouseBuilder" />
</appSettings>
</configuration>

客户端调用代码如下:

    /// <summary>
/// 创建型设计模式
/// </summary>
class Program
{
static void Main(string[] args)
{
{
//Builder生成器调用客户端
BuildSystem buildSystem = new BuildSystem();
buildSystem.Build(new ModernHouse());
}
Console.ReadKey();
}
}

通过配置文件的方式,动态地配置不同风格的房屋对应的房屋Builder来实现需求,该方法能很好的满足需求,这就是Builder生成器的作用,让一个对象的部分创建过程,创建过程保持一致的同时,能创建出不同的实现.

Builder生成器(创建型模式)的更多相关文章

  1. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

  2. 设计模式03: Builder 生成器模式(创建型模式)

    Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将 ...

  3. 设计模式学习之建造者模式(Builder,创建型模式)(6)

    假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...

  4. 【转】设计模式(三)建造者模式Builder(创建型)

    (http://blog.csdn.net/hguisu/article/details/7518060) 1. 概述 在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对 ...

  5. 设计模式(三)建造者模式Builder(创建型)

    1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...

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

    1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...

  7. 创建型模式之Builder(建造者)模式

    GitHub地址:https://github.com/zhangboqing/design-mode/tree/master/src/main/java/com/zbq     一.定义 建造者模式 ...

  8. 设计模式之美:Creational Patterns(创建型模式)

    创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...

  9. .NET设计模式(7):创建型模式专题总结(Creational Pattern)(转)

    概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模 ...

随机推荐

  1. k8s容器挂载配置文件

    1.新建ConfigMap apiVersion: v1 kind: ConfigMap metadata: name: test-conf namespace: default labels: na ...

  2. 【转】MapReduce:详解Shuffle过程

    ——转自:{http://langyu.iteye.com/blog/992916} Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle ...

  3. SQL 查找重复记录

    CREATE TABLE product( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, Pid INT NOT NULL, Pname VARCHAR(50) ...

  4. Leed code 11. Container With Most Water

    public int maxArea(int[] height) { int left = 0, right = height.length - 1; int maxArea = 0; while ( ...

  5. Series转成list

    直接list(series)就可以的 最佳的方式是将列表转换成Python中的科学计算包numpy包的array类型,再进行加减. 1 2 3 4 import numpy as np a = np. ...

  6. I/O Planning

    同一个BANK的电压必须是一样的,而电气特性则可以不同. 最近GTX调不出来,原来是电平不对 电源的影响 示波器看电源纹波 VCCO是为BANK的IO输出供电.比如LVCMOS33的信号,这个BANK ...

  7. C语言printf的格式

    例1 int a = 12345;printf("%6d",a); // 输出6位不够左边补空格printf("%.6d",a); // 输出6位不够左边补0例 ...

  8. 如何用命令行将我的Phonegap环境更新到最新版本?

    从npm安装的Phonegap(version > 3.0),更新命令如下 npm update -g phonegap 检查当前本机环境的最新版本 phonegap -v 检查npm的最新ph ...

  9. day02(继承,重写,this,super,final,抽象类)

    继承 概述:日常生活中儿女总会继承长辈的遗产,java语言也是.通过继承多种实物之间形成一种关系. 特点: ①一个类只能继承一个父类 ②一个父类可以有多个子类 ③可以多层继承(a类继承b类   C类继 ...

  10. [A,D]=solverAdini(node,elem,bdEdge,h1,h2)

    >> [A,D]=solverAdini(node,elem,bdEdge,h1,h2) A = (1,1) 14.5000 (2,1) 11.0000 (3,1) 11.5000 (4, ...