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

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

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

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. js前端读写文件的方法(json、excel)

    1.前端读取文件的实现 关键:利用文件上传对话框预览本地文件.利用FileReader读取文件 前端预览本地文件 <input tabindex="-1" id=" ...

  2. java排序算法(十):桶式排序

    java排序算法(十):桶式排序 桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征: 待排序列所有的值处于一个可枚举的范围之类: 待排序 ...

  3. 02-Python的下载和安装_Python编程之路

    原文发布在特克斯博客www.susmote.com 之前给大家讲了关于python的背景知识,还有Python的优点和缺点,相信通过之前的介绍很多人已经清楚自己到底要不要选择学习Python,如果已经 ...

  4. 多目标跟踪(MOT)论文随笔-SIMPLE ONLINE AND REALTIME TRACKING (SORT)

    网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是使用 tracking by detection 方法进行多目标跟踪的文章,是后续de ...

  5. Leetcode 3——Palindrome Number(回文数)

    Problem: Determine whether an integer is a palindrome. Do this without extra space. 简单的回文数,大一肯定有要求写过 ...

  6. 第一次作业:扑通扑通 我的IT

    让我掉下眼泪的不止昨夜的酒,还有这满屏的代码. 第一部分:结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 在炎炎的夏日,伴随这高三的结束,我也面临大学专业的选择,我看着书里密 ...

  7. jQuery函数学习

    函数:after(content) 功能:在每个匹配的元素后面添加html内容 返回:jQuery对象 参数:content (<Content>): Content to insert ...

  8. JAVAGUI设计步骤

    ①创建容器 首先要创建一个GUI应用程序,需要创建一个用于容纳所有其它GUI组件元素的载体,Java中称为容器.典型的包括窗口(Window).框架(Frame/JFrame).对话框(Dialog/ ...

  9. Flask 学习 四 数据库

    class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primary_key=True) name = db.Co ...

  10. bzoj 2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为n的序列, ...