C#设计模式之3-建造者模式
建造者模式(Builder Pattern)
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/393 访问。
建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。
角色:
1、抽象建造者(Builder)
给出一个抽象结论,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建;
2、具体建造者(Concrete Builder)
实现建造者接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。在构造过程完成后,提供产品的实例;
3、指导者(Director)
调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建;
4、产品类(Product)
需要创建的具体的复杂对象。
示例:
命名空间BuilderPattern中包含Vehicle机动车类充当产品类,Builder基类为抽象建造者,东风悦达Yuedakia类、大众汽车Volkswagen类、特斯拉Tesla类。另外包含1个机动车扩展类和1个指导者。本示例向大家演示3个不同的汽车厂商在生产比较复杂的汽车时所采用的策略。
namespace BuilderPattern
public abstract class Builder {
protected Vehicle _product = new Vehicle();
public abstract void BuildCarframe();
public abstract void BuildWheel();
public abstract void BuildDoor();
public abstract void BuildApparatus();
public abstract void BuildColor();
public virtual Vehicle GetResult() {
return _product;
}
}
建造者基类Builder,定义生产不同汽车部位的接口并在内部维持对机动车的引用。
public class Tesla : Builder {
public override void BuildCarframe() {
_product.Carframe = "ZZ32093M3485C1356";
}
public override void BuildWheel() {
_product.Wheel = 4;
}
public override void BuildDoor() {
_product.Door = 5;
}
public override void BuildApparatus() {
_product.Apparatus = "Model X";
}
public override void BuildColor() {
_product.Color = Color.Red;
}
}
具体建造者特斯拉Tesla类,实现抽象建造者Builder的接口。
public class Volkswagen : Builder {
public override void BuildCarframe() {
_product.Carframe = "VS89362P1903C9852";
}
public override void BuildWheel() {
_product.Wheel = 4;
}
public override void BuildDoor() {
_product.Door = 4;
}
public override void BuildApparatus() {
_product.Apparatus = "Skoda";
}
public override void BuildColor() {
_product.Color = Color.Blue;
}
}
具体建造者大众汽车Volkswagen类,实现抽象建造者Builder的接口。
public class Yuedakia : Builder {
public override void BuildCarframe() {
_product.Carframe = "YK9391J0231L30D32";
}
public override void BuildWheel() {
_product.Wheel = 4;
}
public override void BuildDoor() {
_product.Door = 4;
}
public override void BuildApparatus() {
_product.Apparatus = "Kia K3";
}
public override void BuildColor() {
_product.Color = Color.Wheat;
}
}
具体建造者东风悦达Yuedakia类,实现抽象建造者Builder的接口。
public class Vehicle {
public string Carframe { get; set; }
public int Wheel { get; set; }
public int Door { get; set; }
public string Apparatus { get; set; }
public Color Color { get; set; }
public void Print() {
Console.WriteLine($"{this.VehicleInfo()}");
}
}
机动车Vehicle类,这是我们通过建造者模式所要创建的复杂对象。
public class Director {
public void Construct(Builder builder) {
builder.BuildCarframe();
builder.BuildWheel();
builder.BuildDoor();
builder.BuildApparatus();
builder.BuildColor();
}
}
这是指导类Director,它负责对象的创建过程。
public static class Extentions {
public static string VehicleInfo(this Vehicle vehicle) {
var type = vehicle.GetType();
var properties = type.GetProperties();
var result = string.Empty;
foreach (var prop in properties) {
result +=
$"{prop.Name}:{prop.GetValue(vehicle, null)}{Environment.NewLine}";
}
return result;
}
}
一个扩展类,方便演示过程中打印出相关信息。
public class Program {
private static Director _director = null;
private static List<Builder> _builders = null;
private static Vehicle _vehicle = null;
public static void Main(string[] args) {
_director = new Director();
_vehicle = new Vehicle();
_builders = new List<Builder>() {
new Tesla(),
new Volkswagen(),
new Yuedakia()
};
foreach (var builder in _builders) {
_director.Construct(builder);
_vehicle = builder.GetResult();
_vehicle.Print();
}
Console.ReadKey();
}
}
以上是调用方的代码,分别维持对指导者、建造者和机动车的引用,接下来我们创建了3辆汽车,特斯拉的Model X、大众汽车的Skoda和东风悦达的Kia K3。以下是这个案例的输出结果:
Carframe:ZZ32093M3485C1356
Wheel:4
Door:5
Apparatus:Model X
Color:Color [Red]
Carframe:VS89362P1903C9852
Wheel:4
Door:4
Apparatus:Skoda
Color:Color [Blue]
Carframe:YK9391J0231L30D32
Wheel:4
Door:4
Apparatus:Kia K3
Color:Color [Wheat]
优点:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/393 访问。
1、易于解耦,将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品;
2、易于精确控制对象的创建,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰;
3、易于拓展,增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则”。
缺点:
1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;
2、如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制;
3、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
使用场景:
1、需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
C#设计模式之3-建造者模式的更多相关文章
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 设计模式学习之建造者模式(Builder,创建型模式)(6)
假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...
- PHP设计模式之:建造者模式
建造者模式: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 目的: 消除其他对象复杂的创建过程 结构图: 优点: 建造者模式可以很好的将一个对象的实现与相关的“业 ...
- java常用设计模式五:建造者模式
1.定义 是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 产品类:一般是一个较为复杂的对象,也就是说创建对象的 ...
- Java设计模式学习记录-建造者模式
前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...
- java设计模式-----6、建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类 ...
- IOS设计模式浅析之建造者模式(Builder)
定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...
- Java设计模式14:建造者模式
什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是 ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
随机推荐
- IDM的“免费版”NDM免费的下载工具
软件截图 软件介绍 免费小巧的多线程下载工具,支持断点续传,支持浏览器扩展,嗅探下载音视频文件. 和IDM差不多,只不过是免费的 下载软件 Win 我提供的UCloud-OSS 官网下载 Mac 我提 ...
- CI/CD系列之阿里云云效2020应用篇
目录 前言 实战 制品仓库 maven配置 项目pom配置 代码管理 流水线 参考资料 前言 前不久登录阿里云后台,看到云效的介绍,出于好奇便点进去看了看,刚开始以为云效是类似Jenkins的一套自动 ...
- C++语法小记---重载逻辑操作符
重载逻辑操作符 不建议重载逻辑操作符 原因:无法实现逻辑操作符的短路功能(即:不需要计算完全部表达式就可以得出结果) 逻辑操作符:|| && 操作符重载本质上是函数调用,而进行函数调用 ...
- Win7安装Python失败 提示Setup failed
一.安装报错 如图所示,双击Python安装包后进行安装显示Setup failed 安装失败: 二.错误排除 1.首先查看自己的计算机是否已经安装了 Win7 Service Pack 1大补丁,没 ...
- java 如何正确的输出集合或者对象的值
java 如何正确的输出集合或者对象的值 一般out.println(Object) 和 System.out.println(Object),其中输出的都是Object.toString()方法.重 ...
- vue-过渡动画和 第三方动画库导入,带图
vue路由过渡动画 //用transition将路由出口包裹起来 <transition name="fade" mode="out-in"> &l ...
- Mybatis(五)Spring整合Mybatis之mapper动态代理开发
要操作的数据库: IDEA创建的Java工程,目录结构如下: 一.导包 1.spring的jar包 2.Mybatis的jar包 3.Spring+mybatis的整合包. 4.Mysql的数据库驱动 ...
- Eclipse开发Web项目连接MySQL时找不到驱动的解决办法
当我们使用Eclipse开发Web项目连接MySQL时后台报找不到驱动的错误,如下:解决办法: 1.这时我们首先要检查我们是否导入了连接MySQL数据库的jar包,如图,是否已经将jar包复制到项目下 ...
- 一分钟玩转 Spring IoC
前言 「上一篇文章」我们对 Spring 有了初步的认识,而 Spring 全家桶中几乎所有组件都是依赖于 IoC 的. 刚开始听到 IoC,会觉得特别高大上,但其实掰开了很简单. 跟着我的脚步,一文 ...
- PHP readfile() 函数
定义和用法 readfile() 函数读取一个文件,并写入到输出缓冲. 如果成功,该函数返回从文件中读入的字节数.如果失败,该函数返回 FALSE 并附带错误信息.您可以通过在函数名前面添加一个 '@ ...