/// <summary>
  /// 电脑类
  /// </summary>  
  public class Computer
  {
    //电脑组件集合
    private IList<string> parts = new List<string>();

    //把单个组件添加到电脑组件集合中
    public void Add(string part) {
      parts.Add(part);
    }

    //
    public void Show() {
      Console.WriteLine("电脑开始在组装.....");
      foreach (var part in parts)
      {
        Console.WriteLine("组件"+part+"已经装好");
      }
      Console.WriteLine("电脑组装好了");
    }
  }

  /// <summary>
  /// 抽象建造者
  /// </summary>
  public abstract class Builder
  {

    //装CPU
    public abstract void BuilderPartCUP();
    //装主板

    public abstract void BuilderPartMainBoard();
    //获得组装好的电脑

    public abstract Computer GetComputer();
  }

  //组装人1

  public class ConcreteBuilder1 : Builder
  {
    Computer com = new Computer();
    public override void BuilderPartCUP()
    {
      com.Add("CPU1");
    }

    public override void BuilderPartMainBoard()
    {
      com.Add("Main Board1");
    }

    public override Computer GetComputer()
    {
      return com;
    }
  }

  //组装人2

  public class ConcreteBuilder2 : Builder
  {
    Computer com = new Computer();
    public override void BuilderPartCUP()
    {
      com.Add("CPU2");
    }

    public override void BuilderPartMainBoard()
    {
      com.Add("Main Board2");
    }

    public override Computer GetComputer()
    {
      return com;
    }
  }

  //指挥创建

  public class Director {
    public void Construct(Builder builder) {
      builder.BuilderPartCUP();
      builder.BuilderPartMainBoard();
    }
  }

  调用: 

  var dir = new Director();
  Builder con1 = new ConcreteBuilder1();
  Builder con2 = new ConcreteBuilder2();

  dir.Construct(con1);
  var com1 = con1.GetComputer();
  com1.Show();

  dir.Construct(con2);
  var com2 = con2.GetComputer();
  com2.Show();

  

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

  建造者模式使得建造代码与表示代码的分离,可以使客户端不必知道产品内部组成的细节,从而降低了客户端与具体产品之间的耦合度,

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

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

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

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

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

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

  转:http://www.cnblogs.com/zhili/p/BuilderPattern.html

C#建造者模式的更多相关文章

  1. 23种设计模式--建造者模式-Builder Pattern

    一.建造模式的介绍       建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...

  2. PHP设计模式(五)建造者模式(Builder For PHP)

    建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式. 设计场景: 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,爱好等信息,才能获得用 ...

  3. java设计模式之建造者模式

    学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...

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

    一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...

  5. C#设计模式之建造者模式

    建造者模式可以将部件本身和它们的组装过程分开,关注如何一步步创建一个包含多个组成部分的复杂对象,用户只需要指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节. 建造者模式:将一个复杂对象 ...

  6. C#设计模式-建造者模式

    在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由C ...

  7. C#设计模式系列:建造者模式(Builder)

    1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率 中低 1.3>.原型模式应用 ...

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

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

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

    一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...

  10. 设计模式(五)建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

随机推荐

  1. Codeforces Round #430 (Div. 2) - D

    题目链接:http://codeforces.com/contest/842/problem/D 题意:定义Mex为一个序列中最小的未出现的正整数,给定一个长度为n的序列,然后有m个询问,每个询问给定 ...

  2. 【转】uboot中的mmc命令

    转自:https://www.cnblogs.com/yxwkf/p/3855383.html 1:mmcinfo 输入: mmcinfo 显示结果:Manufacturer ID: 45OEM: 1 ...

  3. Codeforces1214D. Treasure Island (dp + Hash)

    题目链接:传送门 思路: 仔细观察可以发现,答案最多就是2,只要把(2,1)和(1,2)堵住就可以了. 答案是0的情况就是初始状态下,(1,1)就已经不可达(n,m)了,很好判断. 所以重点就是区分答 ...

  4. Linux日常之显示文件总结

    1. 将文件file1.file2的内容都显示出来,并显示行号 cat -n file1 file2 2. 将文件file1.file2中带有字符'h'的行显示出来 cat -n file1 file ...

  5. mobilenetV3

    1.MobilenetV3是通过NAS得到的,结合了v1,v2和MnasNet的结构,包括v1的dw,v2的linear bottleneck和逆残差结构, MnasNet的se结构(接在部分line ...

  6. CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造

    题目传送门 https://codeforces.com/contest/1103/problem/C 题解 这个题还算一个有难度的不错的题目吧. 题目给出了两种回答方式: 找出一条长度 \(\geq ...

  7. POJ-3436-ACM Computer Factory(最大流, 输出路径)

    链接: https://vjudge.net/problem/POJ-3436#author=0 题意: 为了追求ACM比赛的公平性,所有用作ACM比赛的电脑性能是一样的,而ACM董事会专门有一条生产 ...

  8. 错误消息对话框QErrorMessage

    继承于   QDialog 样式:   这个复选框的作用:文本框中相同信息时是否再显示 import sys from PyQt5.QtWidgets import QApplication, QWi ...

  9. 【NOIP2016提高A组模拟7.17】锦标赛

    题目 403机房最近决定举行一场锦标赛.锦标赛共有N个人参加,共进行N-1轮.第一轮随机挑选两名选手进行决斗,胜者进入下一轮的比赛,第二轮到第N-1轮再每轮随机挑选1名选手与上一轮胜利的选手决斗,最后 ...

  10. HBase设计规范(转载)

    在这里讲什么设计规范实在是有些不知天高地厚,毕竟笔者本人也只是一个大数据技术的初学者,断然不敢制订什么设计规范的,所以请原谅我的狂妄,这个设计规范,只是本人对自己制订的,与别人无关. 之前,HBase ...