C#中的Builder模式

设计模式中的Builder模式,又叫建造者模式,是一种常用的模式,它主要的作用是分离一个复杂对象的构建过程和复杂对象的表现形式,抽象出构建过程,这样可以使用相同的构建过程,配合依赖注入构建出不用的产品。

UML


其中有两点需要注意。

  • Director和Builder之间是聚合关系而不是合成关系,暗示Director不需要对Builder的生命周期负责,Builder在外部创造并通过依赖注入的方式进入Director。
  • 客户代码使用的时候可以通过Directory间接操作Builder,完成复杂对象的构造,不用直接调用Builder的各个方法。通过这样我们确保Directory统一了复杂对象的创造逻辑。

一个例子

考虑一下一个例子,我们创造一个房子,当然,房子有很多种,有别墅,平房,楼房等,但是抽象的看来,每个房子都需要一下几个步骤

  • CreateWall
  • CreateRoom
  • CreateWindow
  • CreateDoor

而一个房子大概也需要如下属性

  • Wall
  • Room
  • Window
  • Door

这样,我们试着来抽象出房子(在这里是我们的Product)和建造者接口。

    public class House{public string Type { get; set; }public House(string type){Type = type;            }}

很简单的一个类,仅仅一个属性,接着是创建者接口。

    interface IHouseBuilder{void CreateWall();void CreateRoom();void CreateWindow();        void CreateDoor();House GetHouse();}

很简单,对吧?
接着我们试着来创造两个具体的创建者,分别创建平房和楼房。

 class PingHouseBuilder : IHouseBuilder{public void CreateDoor(){Console.WriteLine("ping door");}public void CreateRoom(){Console.WriteLine("ping room");}public void CreateWall(){Console.WriteLine("ping wall");}public void CreateWindow(){Console.WriteLine("ping window");}public House GetHouse(){return new House("ping");}}class LouHouseBuilder : IHouseBuilder{public void CreateDoor(){Console.WriteLine("lou door");}public void CreateRoom(){Console.WriteLine("lou room");}public void CreateWall(){Console.WriteLine("lou wall");}public void CreateWindow(){Console.WriteLine("lou window");}public House GetHouse(){return new House("lou");}}

这是两个相当简单的创建者,通过一些输出显示一些步骤的执行,现实生活中肯定不会那么简单,但是用作示例代码足够了,接下来是我们的Director。

class Director
{IHouseBuilder _builder;public Director(IHouseBuilder builder){this._builder = builder;}public void Construct(){_builder.CreateWall();_builder.CreateRoom();_builder.CreateWindow();_builder.CreateDoor();}
}

从上面看出,通过Construct方法,固定得调用Builder里面的各个步骤。最后看看客户代码。

IHouseBuilder builder = new PingHouseBuilder();
Director director = new Director(builder);
director.Construct();
var house = builder.GetResult();

在上面的代码中,客户代码负责创建builder实例,实例化Director,调用construct,最后通过builder得到创建出来的结果。
如果需要创建不同的House,只需要用替换Director里面的builder即可,其他步骤都可以保持不动,这样就实现了解耦。

和TemplateMethod模式的比较

乍一看,Builder模式和TemplateMethod模式比较相似,都是固定了某些子步骤,方便客户代码能够以固定的顺序或者逻辑来使用子步骤,同时两种模式都能方便再定义子步骤。
但它们之间也有一些区别,主要在于两点。

  • Builder模式是创造模式,主要使用的场景是创造新对象,特别是复杂对象;TemplateMethod模式是行为模式,主要是通过固定子步骤逻辑来统一实现某种行为,比如,在Save之前的SaveCheck等。
  • Builder模式使用依赖注入达到具体Builder和Director的解耦;而TemplateMethod通过继承抽象类达到再定义某些子步骤的效果。

综上,在选择这两种模式的时候,要综合考虑使用的场景再做出决定。

C#中的Builder模式相关推荐

  1. idea使用junit测试_在JUnit测试中使用Builder模式

    idea使用junit测试 这并不是要成为技术含量很高的职位. 这篇文章的目的是为您提供一些指导,以使您的JUnit测试生活更加轻松,使您能够在几分钟内编写复杂的测试场景,并获得具有高度可读性的测试. ...

  2. 在JUnit测试中使用Builder模式

    这并不是要成为技术含量很高的职位. 这篇文章的目的是为您提供一些指导,以使您的JUnit测试生活更加轻松,使您能够在几分钟内编写复杂的测试场景,并具有易于阅读的测试优势. 单元测试中有两个主要部分,需 ...

  3. android builder模式 插件,如何在Kotlin中实现Builder模式?

    首先,在大多数情况下,您不需要在Kotlin中使用构建器,因为我们有默认和命名参数 . 这使您可以写 class Car(val model: String? = null, val year: In ...

  4. java中的builder模式

    import android.text.TextUtils;/*** Created by toothwind on 2017/7/19.* you can contact me at : tooth ...

  5. Intellij idea generate builder 插件-用于自动生成builder模式代码

    2019独角兽企业重金招聘Python工程师标准>>> 目的:开发中喜欢builder模式去构造一个实例,而当一个对象的属性过多的时候,手动的去完成一个类的builder是很繁琐的: ...

  6. 设计模式学习笔记——建造者(Builder)模式

    设计模式学习笔记--建造者(Builder)模式 @(设计模式)[设计模式, 建造者模式, builder] 设计模式学习笔记建造者Builder模式 基本介绍 建造者案例 类图 实现代码 Build ...

  7. Android常考问题(8)-设计模式:Builder模式(顺带学习了一下String的比较和final)

    今天的主要目的是学习设计模式中的Builder模式.由于java基础不牢固,在学习过程中要回过头去学习java内容,因此凑成了这样一篇驳杂的文章. Builder模式 首先是Builder设计模式的作 ...

  8. Builder模式演义

    引言 不用怀疑,你一定遇到和使用过它,它在Android源码和各种开源组件中是如此常见.这是一种你可以不知道怎么运用,但是知道了会欲罢不能的设计模式. 定义 Builder模式(建造者模式,有人称作生 ...

  9. 同事写了一个疯狂的类构造器,我要疯了,Builder 模式都不会么?!!

    疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...

  10. Android Builder模式在开发中的应用

    最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder ...

最新文章

  1. 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法...
  2. 数据结构—顺序表的插入算法
  3. 拼多多季报图解:营收34亿 活跃买家数同比增长144%
  4. python merge很费内存吗,python如何使用merge实现堆
  5. 干货 | 公众号历史文章精选(附资源)
  6. 两部手机怎样才能把数据都传过来_我把魅族换成荣耀,30G的数据文件该如何一键转移?...
  7. Ubuntu网络连接未托管的解决办法
  8. PAT-乙级-1062 最简分数
  9. 矩阵快速幂 POJ 3070 Fibonacci
  10. Visual SourceSafe(VSS)使用手册(转载)
  11. [渝粤教育] 广东-国家-开放大学 21秋期末考试互联网金融10139k2
  12. 李笑来深夜宣布不做个人投资,背后有何深意?
  13. ansible常见模块
  14. python 矩阵特征值分解_特征值分解和奇异值分解
  15. static,entern函数的用法;#define定义符号和宏
  16. 集群系统性能测试Linpack-HPL安装
  17. IE无法安装HP-QC插件
  18. oracle双活什么意思,什么是双活数据中心
  19. c++调用opencv实现图片叠加以及添加水印效果
  20. 本科毕设课题之OJ开发(1)--评测机

热门文章

  1. Hook入门之鼠标钩子
  2. eclipse给jar包打断点
  3. 大数据最佳实践-spark
  4. 用循环队列模拟滑动窗口动态求最值及峰峰值
  5. CWMP(TR069)协议标准学习
  6. 【小游戏】AB猜数字
  7. 中国省份城市0-N编号
  8. 微x怎么设置主题_微话题:小区设置公共晾衣架,您怎么看?您有什么建议?...
  9. Eucalyptus使用注意事项
  10. python文字转语音