Builder模式也是创建型模式中的一种。主要用来应对构成复杂但构成结构和顺序相对稳定的对象的创建工作。目的是省去在对象发生变化时,需要修改代码中每一处对象创建的地方,应用这种模式,可以在一个复杂对象的内部结构(由许多其他子对象构成的结构)发生变化时,仅需要对对象有所修改,而复杂对象与其他的对象之间的关系、行为不需要进行修改。

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

GOF:

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

下面举一个例子,来说明这种应用,比如说买电脑中的装机,根据消费者不同的需求,我们要提供不同品牌不同配置的电脑。

装机器就像Builder模式描述的一样,组装成机器的方法(即用子对象构建对象的算法)是稳定的,但是根据客户的需求可能对机器现有配置要求升级,则只是子对象发生了变化,但是这不影响极其的组装方法。

定义组装成电脑需要的设备,这里为了代码量少一些,简化了电脑的构建,粗略的分为CPU、主板、内存、硬盘、键盘、鼠标。首先构建它们对应的抽象类。

// 电脑

public abstract class Computer

{

}

// CPU

public abstract class CPU

{

}

// 主板

public abstract class Mainboard

{

}

// 内存

public abstract class Memory

{

}

// 硬盘

public abstract class Harddisk

{

}

// 键盘

public abstract class Keyboard

{

}

// 鼠标

public abstract class Mouse

{

}

然后,就可以定义构建组装电脑需要的配件的抽象方法。

public abstract class ComputerBuilder

{

public abstract void BuildCPU();

public abstract void BuildMainboard();

public abstract void BuildMemory();

public abstract void BuildHarddisk();

public abstract void BuildKeyboard();

public abstract void BuildMouse();

public abstract Computer GetComputer();

}

这里仅提供了一种品牌机的标准配置IBM。这时就可以来构建我们实际需要的IBM配件(实际子对象)了。

// IBM电脑

public class IBMComputer : Computer

{

}

// IBMCPU

public class IBMCPU : CPU

{

}

// IBM主板

public class IBMMainboard : Mainboard

{

}

// IBM内存

public class IBMMemory : Memory

{

}

// IBM硬盘

public class IBMHarddisk : Harddisk

{

}

// IBM键盘

public class IBMKeyboard : Keyboard

{

}

// IBM鼠标

public class IBMMouse : Mouse

{

}

到这里我们就需要定义,组装IBM配件的方法了。为了简单,这里又定义了一个用来存储实际需要的配件集合,用来存储我们构建出来的配件(子对象)。

public class AssemblyComputer

{

// 组装起来的电脑配件

ArrayList accessories = new ArrayList();

public void Add(string part)

{

accessories.Add(part);

}

public void ShowDetails ()

{

Console.WriteLine( "Computer Accessories: " );

foreach(string part in accessories)

Console.WriteLine(part);

}

}

这时我们的ComputerBuilder方法和集成自它的实际构建方法IBMComputerBuilder就需要有所修改,返回一个我们建立的辅助信息存储类型的对象AssemblyComputer。以下为修改后的IBM电脑子对象构建类。

public class IBMComputerBuilder : ComputerBuilder

{

AssemblyComputer ac = new AssemblyComputer();

public override void BuildCPU()

{

ac.Add("IBMCPU");

}

public override void BuildMainboard()

{

ac.Add("IBMMainboard");

}

public override void BuildMemory()

{

ac.Add("IBMMemory");

}

public override void BuildHarddisk()

{

ac.Add("IBMHarddisk");

}

public override void BuildKeyboard()

{

ac.Add("IBMKeyboard");

}

public override void BuildMouse()

{

ac.Add("IBMMouse");

}

public override AssemblyComputer GetComputer()

{

return ac;

}

}

相应的抽象类也做修改。

public abstract class ComputerBuilder

{

public abstract void BuildCPU();

public abstract void BuildMainboard();

public abstract void BuildMemory();

public abstract void BuildHarddisk();

public abstract void BuildKeyboard();

public abstract void BuildMouse();

public abstract AssemblyComputer GetComputer();

}

最后,我们定这个电脑的配置类,就是这台电脑的实际配置。

public class ComputerConfiguration

{

public static AssemblyComputer CreateComputer(ComputerBuilder computerbuilder)

{

computerbuilder.BuildCPU();

computerbuilder.BuildMainboard();

computerbuilder.BuildMemory();

computerbuilder.BuildHarddisk();

computerbuilder.BuildKeyboard();

computerbuilder.BuildMouse();

return computerbuilder.GetComputer();

}

}

其中的CreateComputer方法就是构建了一个电脑的实际配置例子。这里有一点需要强调的就是,这台电脑需要的配件是稳定的,需要CPU、主板、内存、硬盘、键盘、鼠标。至于具体需要什么牌子的,很可能客户就不要IBM的键盘鼠标,而需要一套罗技的键盘和鼠标,这时只要修改我们IBM的构建类,或者是添加一个新的自定义电脑配置类,然后在这个自定义构建类中定义我们需要的具体配件,而这些配件(子对象)构建出来的电脑对象的构建过程是不变的。

这样,我们在客户程序中使用定义好的对象时可以使用下面的代码。

AssemblyComputer ac = ComputerConfiguration.CreateComputer(new IBMComputerBuilder());

ac.ShowDetails();

Console.ReadLine();

首先定一个电脑配置,然后使用一个需要的配置的生成器,最后将电脑配置呈现出来。

得到执行结果:

Computer Accessories:

IBMCPU

IBMMainboard

IBMMemory

IBMHarddisk

IBMKeyboard

IBMMouse

看到这段代码可能大家还是感觉有新的配置后在维护的时候仍然需要修改new IBMComputerBuilder()这里,我们可以使用反射机制来解决这种问题,这样就解决了扩展上不许重新进行编译的问题。如果以前的有所修改那就直接替换掉相应的DLL程序集就可以了。方便了以后的维护扩展工作。

转载于:https://www.cnblogs.com/Bear-Study-Hard/archive/2006/10/24/538606.html

我的设计模式之旅(4)——生成器(建造者)模式Builder相关推荐

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

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

  2. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

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

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

  4. 【学习设计模式8】组装流水线——建造者模式

    上篇: [学习设计模式7]复制粘贴就得了--原型模式_Aiky哇的博客-CSDN博客那么有没有一种方法可以名正言顺的复制粘贴呢?当然有了,那就是原型模式.原型模式也叫克隆模式.https://aiky ...

  5. 大话设计模式读书笔记11----建造者模式(Builder)

    建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的建造过程可以创建不同的表示. 1.Builder是什么? 是创建一个Product对象的各个部件指定的抽象接口. 2.Con ...

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

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

  7. 设计模式解密(6) - 建造者模式(生成器模式)

    1.简介 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 分解一下定义: 1.复杂对象的表示: 2.复杂对象的构建过程: 3.可分离的通用构建过程,也适用于其它复杂对 ...

  8. .NET设计模式(4):建造者模式(Builder Pattern)(转)

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

  9. C#设计模式学习笔记:(4)建造者模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,记录一下学习过程以备后续查用.一.引言在现实生活中,我们经常会遇到一些构成比较复杂的物 ...

最新文章

  1. 01-1制作U盘启动盘--大白菜超级U盘启动盘制作工具
  2. 华人一作统一「视觉-语言」理解与生成:一键生成图像标注,完成视觉问答,Demo可玩...
  3. 机器学习如何帮助企业高效地管理数据?
  4. 前端月趋势榜:5 月最热门的 20 个前端开源项目 - 2105
  5. Ajax框架,DWR介绍,应用,样例
  6. python csv读取数据 去掉标题-Python读csv文件去掉一列后再写入新的文件实例
  7. 江西省能源局发布第一、二批省级光伏度电补贴目录
  8. python汉诺塔问题_Python汉诺塔问题
  9. 立镖机器人浙江_立镖现身LogiMAT 2019 彰显中国仓储分拣技术
  10. Vlookup函数多返回值处理
  11. 【李宏毅2020 ML/DL】P82 Generative Adversarial Network | Improving Sequence Generation by GAN
  12. 2019基金产品布局必备数据
  13. 第二重要极限公式推导过程_土木考研 土力学第六章公式推导
  14. 计算机驱动空间的c盘不足怎么办,如果C驱动器空间不足,该怎么办
  15. 高频java基础面试题
  16. html 页眉选项卡,步骤如下: (1)在插入选项卡的页眉和页脚选项组中单击【页眉】按钮...
  17. PrimoCache2.2.0汉化程序与2.0.0的交叉使用
  18. maven--入门使用及环境变量配置
  19. JavaScript 删除对象中的某一项
  20. 【调参15】如何配置神经网络的学习率

热门文章

  1. poj1251 Jungle Roads Kruskal算法+并查集
  2. 解决VMWARE安装macos系统找不到虚拟磁盘问题
  3. 天涯煮酒又发现一篇好文,王阳明传,序就很漂亮,转一下
  4. jupyter 托管_如何在本地托管的Jupyter Notebook上进行协作
  5. C语言高级编程:如何确定一个变量是有符号还是无符号数
  6. protel布线需要注意事项
  7. js修改地址栏url_不同寻常的地址栏过渡
  8. python response.json()报错_解决Django响应JsonResponse返回json格式数据报错问题
  9. python递归函数的思想_Python递归函数实例讲解
  10. gorm preload 搜索_文件太多忘记了文件放在什么地方?那你可以试试这款文件搜索工具...