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

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

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

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. Java学习日记——基本数据类型

    基本数据类型: byte 1个字节 正负都能表示2的8-1次方 -128~127(包括0) short 2个字节 2的16-1次 整数类型 (默认为int类型) int 4个字节 2的32-1次方 l ...

  2. python全栈开发-Day12 三元表达式、函数递归、匿名函数、内置函数

    一. 三元表达式 一 .三元表达式 仅应用于: 1.条件成立返回,一个值 2.条件不成立返回 ,一个值 def max2(x,y): #普通函数定义 if x > y: return x els ...

  3. 福州大学W班-Beta冲刺评分

    作业链接 https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/1428 作业要求 1.博客具体要求 昨天的困 ...

  4. Beta Scrum

    听说 Beta Scrum Day 1

  5. Java作业-集合

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { r ...

  6. Mybatis-select-返回值类型错误理解

    Mybatis :Cause: java.lang.UnsupportedOperationException异常: 今天在写一个练手项目,作为初学Mybatis的小白,想着这里findByEmp_i ...

  7. 2-51单片机WIFI学习(开发板测试远程通信详细介绍)

    前一篇链接(最后有APP安装包下载地址) http://www.cnblogs.com/yangfengwu/p/8720148.html 由于自己别的贴片的板子还没到,所以用自己的8266最小系统板 ...

  8. Jenkins中展示HTML测试报告

    背景:测试报告是用reportNG生成的,属于java自动化测试项目. 1)         安装插件 首先要安装HTML Publisher plugin,这个在插件管理里面搜索并安装即可,如下我已 ...

  9. Python内置函数(19)——oct

    英文文档: oct(x) Convert an integer number to an octal string. The result is a valid Python expression. ...

  10. SpringMvc返回报文形式的控制-验证方法: JSON or HTML or XML

    首先,请求通过accept请求头声明了支持的返回格式 然后,框架根据该请求头和代码实现(注解)选择了对应的MessageConverter处理返回! 一.验证过程 1.返回html 1.1.请求组装 ...