博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习笔记-建造者模式
阅读量:4948 次
发布时间:2019-06-11

本文共 2782 字,大约阅读时间需要 9 分钟。

概述:                                                                                                      

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

使用场合:                                                                                                

1.当创建复杂对象的算法应该独立于该对象的组成部分及他们的装配方式时。

2.当构造过程必须允许被构造的对象有不同的表示时。

类图:                                                                                                      

代码结构实例:                                                                                           

1.具体的产品类,即我们要制造的产品

///  /// 具体的产品类,由多个部件组成 ///      class Product     {
IList
parts = new List
(); ///
/// 添加产品部件 /// public void Add(string part) {
parts.Add(part); } public void Show() {
Console.WriteLine("\n 产品 创建----"); foreach(string part in parts) {
Console.WriteLine(part); } } }

2.建造产品的抽象类,定义了怎么建造这个产品的方法和产生出来的结果,但是不负责具体建造

///  /// 抽象建造者类,确定产品由PartA和PartB组成,并声明一个得到产品建造结果的方法GetResult() ///      abstract class Builder     {
public abstract void BuilderPartA(); public abstract void BuilderPartB(); public abstract Product GetResult(); }

3.具体建造类,实现抽象类的所有方法,按照抽象的设计来完成产品的建造和出厂过程,但是可以可以根据不同的客户需求

   选用不同的配件,实现产品制造这个过程。下面是两条不同的产品制造过程,制造出同一类产品。

///  /// 具体建造者类 ///      class ConcreteBuilder1:Builder     {
private Product product = new Product(); public override void BuilderPartA() {
product.Add("部件A"); } public override void BuilderPartB() {
product.Add("部件B"); } public override Product GetResult() {
return product; } } /// /// 具体建造者类 /// class ConcreteBuilder2:Builder {
private Product product = new Product(); public override void BuilderPartA() {
product.Add("部件X"); } public override void BuilderPartB() {
product.Add("部件Y"); } public override Product GetResult() {
return product; } }

4.有了产品规格,制造流程图,制造车间,还缺一个负责调度的家伙,他来操作制造的机器,但是结果是具体的机器吐出来的产品,所以这个家伙只管闭着眼睛造就行了。

///  /// 指挥者类 ///      class Director     {
public void Construct(Builder builder) {
builder.BuilderPartA(); builder.BuilderPartB(); } }

5.客户端调用,开始造吧

///  /// 测试建造者模式 ///          static void TestBuilder()         {
//指挥者到现场来了 Director director = new Director(); //机器1开启,热身 Builder b1 = new ConcreteBuilder1(); //机器2开启,热身 Builder b2 = new ConcreteBuilder2(); //指挥者用 ConcreteBuilder1来创建产品 director.Construct(b1); //产品就这样从ConcreteBuilder1的pp里出来了 Product p1 = b1.GetResult(); //放到桌面上就能看见了 p1.Show(); //指挥者用 ConcreteBuilder2来创建产品 director.Construct(b2); //产品就这样从ConcreteBuilder2的pp里出来了 Product p2 = b2.GetResult(); //放到桌面上就能看见了 p2.Show(); Console.Read(); }

小结:                                                                                                       

如果你在构造一个复杂的东西(对象)的时候,最好把调度者,建造蓝图,产品规格,建造机器都分开来,这像一个制造流程,但是如果你只需要制作一个手工艺品例如折纸,那就算了。

转载于:https://www.cnblogs.com/jqbird/archive/2011/08/23/2150432.html

你可能感兴趣的文章
Shell
查看>>
[loj 2478][luogu P4843]「九省联考 2018」林克卡特树
查看>>
电脑插上耳机没声音
查看>>
pyqt5的使用目录
查看>>
UVA 1395 Slim Span 最小生成树
查看>>
Bug管理工具(TCE)之缺陷流程定制
查看>>
srv.exe蠕虫病毒~
查看>>
hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系...
查看>>
2.Flask jinjia2模板
查看>>
subprocess.Popen命令如何隐藏弹框
查看>>
java基础英语---第二十八天
查看>>
C语言 · 高精度加法
查看>>
前后端的关系
查看>>
flask登录功能实现的思路
查看>>
命令行创建Android应用,命令行生成签名文件,命令行查看签名信息,对APK包签名并编译运行...
查看>>
【SQLite】可视化工具SQLite studio
查看>>
python的嵌套列表推导
查看>>
C# Array
查看>>
mybatis与Spring的整合
查看>>
让人生厌的社交分享让人疲于分享
查看>>