推荐阅读:

      当一个复杂对象由一些子对象构成,并且子对象的变化会导致复杂对象的修改。这时我们需要提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化,从而保持系统中的"稳定构建算法"不随需求的改变而改变,这就是今天要给大家分享的建造者模式。

建造者模式(Builder Pattern)

      建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式要素:

1、抽象建造者(Builder):给出一个抽象结论,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建;

2、具体建造者(Concrete Builder):实现建造者接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。在构造过程完成后,提供产品的实例;

3、指导者(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建;

4、产品类(Product):需要创建的具体的复杂对象。

下面举个例子来为大家讲解一下吧。

      命名空间建造者模式中包含Phone手机类充当产品类,Builder基类为抽象建造者,华为HF类、小米XM类、魅族MZ类。另外包含1个手机扩展类和1个指导者。本示例向大家演示3个不同的手机厂商在生产比较复杂的汽车时所采用的策略。

      理清了这个逻辑过程之后,下面就具体看下如何用代码来表示这种现实生活中的逻辑过程:

1.创建抽象建造者Builder

public abstract class Builder {

    protected phone = new Phone();//手机

    public abstract void BuildCPU();//CPU

    public abstract void BuildBattery();//电池

    public abstract void BuildSpeaker();//扬声器

    public abstract void BuildColor();//颜色

    public virtual Phone GetPhone() {
return phone;
}
}

2.具体建造者(CPU,Battery,Speaker,Color)


public class HW : Builder { public override void BuildCPU() {
phone.Carframe = "华为的处理器";
} public override void BuildBattery() {
phone.Battery = 3000;
} public override void BuildSpeaker() {
phone.Speaker= "华为的扬声器";
} public override void BuildColor() {
phone.Color= "华为的专属颜色";
}
} public class XM : Builder { public override void BuildCPU() {
phone.Carframe = "小米的处理器";
} public override void BuildBattery() {
phone.Battery = 3500;
} public override void BuildSpeaker() {
phone.Speaker= "小米的扬声器";
} public override void BuildColor() {
phone.Color= "小米的专属颜色";
}
} public class MZ : Builder { public override void BuildCPU() {
phone.Carframe = "魅族的处理器";
} public override void BuildBattery() {
phone.Battery = 2500;
} public override void BuildSpeaker() {
phone.Speaker= "魅族的扬声器";
} public override void BuildColor() {
phone.Color= "魅族的专属颜色";
}
}

3.指导者Director


public class Director {
public void Construct(Builder builder) {
builder.BuildCPU();
builder.BuildBattery();
builder.BuildSpeaker();
builder.BuildColor();
}
}

4.一个扩展类

public static class Extentions {

    public static string VehicleInfo(this Vehicle vehicle) {
var type = vehicle.GetType();
var properties = type.GetProperties();
var result = string.Empty;
foreach (var prop in properties) {
result +=
$"{prop.Name}:{prop.GetValue(vehicle, null)}{Environment.NewLine}";
}
return result;
}
}

5.调用方的代码,分别维持对指导者、建造者和手机的引用,接下来我们创建了3部手机。

public class Program {

    private static Director _director = null;

    private static List<Builder> _builders = null;

    private static Phone _phone = null;

    public static void Main(string[] args) {
_director = new Director();
_phone = new Phone (); _builders = new List<Builder>() {
new HW(),
new XM(),
new MZ()
}; foreach (var builder in _builders) {
_director.Construct(builder);
_phone = builder.GetResult();
_phone .Print();
} Console.ReadKey();
} }

      上面,我们介绍完了建造者模式的具体实现之后,最后让我们总结下建造模式的实现要点:

1.在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。

2.。建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的的变化如硬盘的大小变了,CPU由单核变双核等)。

3.产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。

4.在前面文章中介绍的抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。

5.由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。

设计模式(C#)——03建造者模式的更多相关文章

  1. java23种设计模式——五、建造者模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

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

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

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

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

  4. PHP设计模式之:建造者模式

    建造者模式: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 目的: 消除其他对象复杂的创建过程 结构图: 优点: 建造者模式可以很好的将一个对象的实现与相关的“业 ...

  5. java常用设计模式五:建造者模式

    1.定义 是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 产品类:一般是一个较为复杂的对象,也就是说创建对象的 ...

  6. Java设计模式学习记录-建造者模式

    前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...

  7. java设计模式-----6、建造者模式

    Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类 ...

  8. IOS设计模式浅析之建造者模式(Builder)

    定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...

  9. Java设计模式14:建造者模式

    什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是 ...

随机推荐

  1. WPF音乐电台

    最近一两年都没写过wpf相关的项目了,本来就不太熟的一些技巧全忘光啦,为了重新拾起这点东西,就花了几天时间做了个小demo,大致功能就是读取豆瓣电台api,获取歌单列表听歌.最开始是参考网上现有的例子 ...

  2. 我造了个好大的"轮子",居然还不是"圆"的!

      我造的这个"轮子"指的是集低代码开发与运维为一体的平台,为什么说它不是"圆"的,因为它有些与众不同,甚至可以说是有些另类.至于为什么造这个"轮子& ...

  3. [Revit]Autodesk Revit 二次开发整理(资料、准备工作和环境搭建)

    1 前言 Revit被Autodesk收购之后,整理和开放了一大部分API,供开发者实现自己的功能和程序,总体来说API的功能比较完善,毕竟市面上已经出现了各式各样的插件. 本人也是初学者,在Revi ...

  4. 关于STM32F103+ESP8266+阿里云过程之设备状态更新至阿里云(三)

    设备与阿里云完成发布订阅的功能,接下来就是将设备状态如温湿度,PM2.5值上报更新至阿里云. 1.查看Topic. 在阿里云平台上 设备->Topic列表中查看.在产品中也可以看到对应的Topi ...

  5. 在WPF中嵌入WebBrowser可视化页面

    无论是哪种C/S技术,涉及数据可视化就非常的累赘了,当然大神也一定有,只不过面向大多数人,还是通过网页来实现,有的时候不想把这两个功能分开,一般会是客户的原因,所以我们打算在WPF中嵌入WebBrow ...

  6. 【iOS】iOS main() 简介

    C 语言编写的程序,其执行入口都是 main(). 用 Objective-C 语言编写的程序也是这样. main.m 中的代码如下: int main(int argc, char * argv[] ...

  7. 改MySQL的编码方式,解决jdbc MySQL中文乱码问题

    进MySQL安装目录,打开my.ini 这两个地方改成gbk 重启服务

  8. Something wrong with EnCase v8 index search results

    My friend told me that she installed EnCase v8.05 on her workstation which OS version is Win 10. She ...

  9. 如何在MySQL中输入中文

    解决MySQL中的Incorrect string value MySQL中输入中文:在MySQL建标的时候,直接往表中的varchar(255)中输入中文的话是会报错的,大概是因为数据库的默认编码是 ...

  10. Android平台使用Ceres Solver

    在Android平台上使用Ceres求解器,官方教程不明确,且编译过程遇到了很多问题. 环境 Ubuntu 18.04 源代码 https://github.com/Great-Keith/ceres ...