介绍完工厂模式,现在来看一下建造者模式。建造者模式就是将一系列对象组装为一个完整对象并且返回给用户,例如汽车,就是需要由各个部件来由工人建造成一个复杂的组合实体,这个复杂实体的构造过程就被外部化到一个建造者的对象,由这个建造者对象返回创建好的实体,是不是跟工厂很像呀?

建造者模式则主要由几个对象构成:

  • 抽象建造者
  • 具体建造者
  • 指挥者
  • 产品角色

UML 类图如下:



抽象建造者负责定义建造者的行为,这里使用接口/抽象类均可,而具体建造者则实现了抽象建造者,负责具体的建造行为。

指挥者是针对抽象建造者进行变成,是将这些建造者的建造行为进行逻辑处理,不论你传入哪种不同的建造者,都能保证建造流程一致性。

而建造者模式则是将构造复杂对象的内部与对象的具体表现隔离开来,使得同样的建造过程可以创造出不同的表现。

上代码:

// 抽象建造者
public abstract class AbsBuilder
{
public abstract void AddHead();
public abstract void AddBody();
public abstract void AddFoot();
public abstract Product GetResult();
}
// 抽象产品
public abstract class Product
{
public abstract void Show();
}
// 字符串产品 A
public class ProductA : Product
{
public string Content {get; set;}
public override void Show()
{
Console.WriteLine(Content);
}
}
// 整形产品 B
public class ProductB : Product
{
public int Content {get; set;}
public override void Show()
{
Console.WriteLine(Content);
}
}
// 建造者 A,负责构建字符串产品
public class BuilderA : AbsBuilder
{
private ProductA _product = new ProductA();
public override void AddHead()
{
_product.Content += "This is Head\r\n";
}
public override void AddBody()
{
_product.Content += "This is Body\r\n";
}
public override void AddFoot()
{
_product.Content += "This is Foot\r\n";
}
public override Product GetResult()
{
return _product;
}
}
// 建造者 B,负责构建整形产品
public class BuilderB : AbsBuilder
{
private ProductB _product = new ProductB();
public override void AddHead()
{
_product.Content += 1;
}
public override void AddBody()
{
_product.Content += 10;
}
public override void AddFoot()
{
_product.Content += 11;
}
public override Product GetResult()
{
return _product;
}
}
// 指挥者
public class Director
{
public Product Construct(AbsBuilder builder)
{
builder.AddHead();
builder.AddBody();
builder.AddFoot();
return builder.GetResult();
}
}
public class Program
{
public static Main()
{
var director = new Director();
var product = director.Construct(new BuilderA());
var productB = director.Construct(new BuilderB());
product.Show();
productB.Show();
}
}

建造者模式如果需要新增一个建造者的话十分方便,符合开闭原则,只需要编写一个实现了抽象类的建造者即可,十分方便扩展。

而且对于复杂的对象的构建过程可以在具体的建造者内部进行精细化控制。

  • 适用于需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性;
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序;
  • 独立于创建该对象的类;隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同类型的产品。

[C#]设计模式-建造者模式-创建型模式的更多相关文章

  1. Java经典设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  2. 初探Java设计模式1:创建型模式(工厂,单例等)

    Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...

  3. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  4. Java经典设计模式之五大创建型模式

    转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...

  5. FactoryMethod工厂方法模式(创建型模式)

    1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...

  6. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

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

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

  8. 设计模式(五):PROTOTYPE原型模式 -- 创建型模式

    1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...

  9. NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)

    创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...

  10. Java设计模式 - 单例模式(创建型模式)

    单例模式我在上学期看一些资料时候学习过,没想到这学期的软件体系结构就有设计模式学习,不过看似篇幅不大,介绍得比较简单,在这里我总结下单例模式,一来整理之前的笔记,二来也算是预习复习课程了. 概述 单例 ...

随机推荐

  1. Algorithm --> 十大排序算法

    十大排序算法 主要排序法有:  一.冒泡( Bubble)排序—— 相邻交换  二.选择排序 ——每次最小/ 大排在相应的位置  三.插入排序 ——将下一个插入已排好的序列中  四.壳( Shell) ...

  2. Django+xadmin打造在线教育平台(七)

    十.授课教师 10.1.讲师列表页 拷贝teacher-list.html和teacher-detail.html到templates目录下 先改teacher-list.html,同样继承base. ...

  3. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

  4. C语言第六次博客作业--数据类型

    一.PTA实验作业 题目1:区位码输入法 1. 本题PTA提交列表 2. 设计思路 (1)定义整型变量code放区位码,areacode放区码,digitcode放位码,one放个位数,two放十位数 ...

  5. 201621123062《java程序设计》第六周作业总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...

  6. Spring事务注意点

    service中未带事务的方法调用了自身带事务的方法时,按下面写法数据是提交不了的. public String getMaxSystemVersionNo() { SystemVersion ver ...

  7. node创建第一个应用

    如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...

  8. windows系统下安装 node.js (node.js安装及环境配置)

    node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node. ...

  9. django报错invalid literal for int() with base 10: ''

    这种错误是因为模型类中某个字段的条件约束为int类型,但是给了一个字符串类型,所以报错,找到那个模型类的字段,并对应修改就好了.

  10. RocketMQ(二):RPC通讯

    匠心零度 转载请注明原创出处,谢谢! RocketMQ网络部署图 NameServer:在系统中是做命名服务,更新和发现 broker服务. Broker-Master:broker 消息主机服务器. ...