[C#]设计模式-建造者模式-创建型模式
介绍完工厂模式,现在来看一下建造者模式。建造者模式就是将一系列对象组装为一个完整对象并且返回给用户,例如汽车,就是需要由各个部件来由工人建造成一个复杂的组合实体,这个复杂实体的构造过程就被外部化到一个建造者的对象,由这个建造者对象返回创建好的实体,是不是跟工厂很像呀?
建造者模式则主要由几个对象构成:
- 抽象建造者
- 具体建造者
- 指挥者
- 产品角色
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#]设计模式-建造者模式-创建型模式的更多相关文章
- Java经典设计模式之五大创建型模式(附实例和详解)
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
- 初探Java设计模式1:创建型模式(工厂,单例等)
Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...
- Java设计模式之五大创建型模式(附实例和详解)
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
- Java经典设计模式之五大创建型模式
转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...
- FactoryMethod工厂方法模式(创建型模式)
1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...
- Prototype原型模式(创建型模式)
1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- 设计模式(五):PROTOTYPE原型模式 -- 创建型模式
1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...
- NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)
创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...
- Java设计模式 - 单例模式(创建型模式)
单例模式我在上学期看一些资料时候学习过,没想到这学期的软件体系结构就有设计模式学习,不过看似篇幅不大,介绍得比较简单,在这里我总结下单例模式,一来整理之前的笔记,二来也算是预习复习课程了. 概述 单例 ...
随机推荐
- C语言的字符串操作函数小结
一.strcat()函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾.它返回一个指向字符串de ...
- 最近用spring4.x整合Jackson------>java.lang.ClassNotFoundException:
最近用spring4.x整合Jackson,结果莫名其妙的一直报错,网上收索的结果都是在maven或者gradle的环境下配置依赖条件解决的:但是eclipseIDE环境下的jar包应该是会自动依赖影 ...
- 分享:docker swarm集群搭建
[Y_H]实践原创 三台虚拟机:1台centOS , 2台ubuntu. 网上有用docker-machine创建虚拟机做的例子. 这里直接用VMware创建这三台虚拟机,然后用xshell连 ...
- java基础之类与对象
[类 & 对象] 1.类:具有一系列相同属性(特征)和方法(行为)的个体的集合,称为类. 类是一个抽象的概念,只能说类具有哪些属性,而不能直接对属性进行赋值. 例如:人类有身高的属性,但是不能 ...
- Rails + React +antd + Redux环境搭建
前提条件:node和ruby on rails必须已经安装好(相关安装流程不再此处介绍) 1.nvm.node 2.npm or yarn装一个就好 3.rvm.ruby on rails 4.for ...
- Ubuntu16.04安装postgresql9.4及pgadmin3图形管理界面
参考原文链接:http://www.cnblogs.com/sparkdev/p/5678874.html 安装前的检查 首先查看是否已经安装了旧版本: dpkg -l |grep postgresq ...
- C语言函函数嵌套
一.实验作业 1.1 PTA题目 设计思路 1.定义整形变量i,if(b==n-1)用于递归的终止,并返回1. 2.for i=b to n ,if(a[i]<a[min]);进行升序排序 3. ...
- Software Engineering-HW3 264&249
title: Software Engineering-HW3 date: 2017-10-05 10:04:08 tags: HW --- 小组成员 264 李世钰 249 王成科 项目地址 htt ...
- 2017-2018-1 Java演绎法 小组成员贡献量汇总
[第一周]贡献量(31) [说明] 完成情况 是指 每次是否全部完成分配的任务,如果全部完成贡献量记为1,否则记为0,与贡献量(时间量)相加计算贡献比例,由于前十周有具体的任务分配,Alpha阶段(第 ...
- beta版本复审
C++team复审 小组 优点 缺点 打分 MyGod小组 MyGod团队开发了一个让武汉大学的学生能够方便地了解校内二手物品交易信息,并进行相应的交易的安卓app.出发点不错,有创新点.使用了一下他 ...