设计模式笔记——生成器模式(Builder Pattern)

一、概述
在软件系统中,把构造对象实例的逻辑移到了类的外部,在这个类的外部定义了类的逻辑。它把一个复杂对象的构造过程从对象的表示中分离出来了,其直接效果是将一个复杂的对象简化为一个比较简单的目标对象。它强调的是产品构造过程。
 
二、意图
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
 
三、Builder模式的结构
Builder:为创建Product对象的各个部件指定抽象接口。
ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
Director:构造一个使用Builer接口的对象。
Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,以及将这些部件装配成最终产品的接口。
 
四、举例:
我们用KFC套餐为例,KFC中存在以下对象,各种食物Product,有收银员Director,可配置套餐菜单接口(主食+零食+饮料)Builder,具体套餐搭配ConcreteBuilder。

1. 首先给定可配置套餐菜单接口(主食+零食+饮料)Builder:

 

    abstract public class Builder{// BuildPartA,BuildPartB,BuildPartC具体的套餐方法abstract public void BuildPartA();abstract public void BuildPartB();abstract public void BuildPartC();abstract public Product GetResult();}

2.我们需要KFC的产品:

 

    public class Product{ArrayList parts = new ArrayList();public void Add(string part){parts.Add(part);}public void Show(){Console.WriteLine(" Product Parts -------");foreach (string part in parts)Console.WriteLine(part);}}

 

3. 然后,我们给出具体套餐搭配ConcreteBuilderA:

 

 public class ConcreteBuilderA:Builder{private Product product;// Methodsoverride public void BuildPartA(){product = new Product();product.Add("麦香鸡腿堡");}override public void BuildPartB(){product.Add("加冰可乐");}override public void BuildPartC(){product.Add("大薯条");}override public Product GetResult(){return product;}}

 4. 然后,我们给出具体套餐搭配ConcreteBuilderB:

 

public class ConcreteBuilderB:Builder{private Product product;// Methodsoverride public void BuildPartA(){product = new Product();product.Add("香辣鸡腿堡");}override public void BuildPartB(){product.Add("可乐不加冰");}override public void BuildPartC(){product.Add("小薯条");}public override  Product GetResult(){return product;}}


5. 现在我们需要一个收银员Director:

 

   public class Director{public void Construct(Builder builder){builder.BuildPartA();builder.BuildPartB();builder.BuildPartC();}}

6. 最后我们完成Client购买KFC套餐:

 

class Program{static void Main(string[] args){Director director = new Director();Builder b1 = new ConcreteBuilderA();Builder b2 = new ConcreteBuilderB();director.Construct(b1);Product p1 = b1.GetResult();p1.Show();director.Construct(b2);Product p2 = b2.GetResult();p2.Show();Console.ReadKey();}}

 

 这样Client分别买了两种不同的套餐,Client只需要让收款员知道你需要那种套餐即可,不需要了解具体套餐是如何实现的。

五、优点:
 1.建造者模式的“加工工艺”是暴露的,这样使得建造者模式更加灵活。
 2.解耦了组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。--上面对KFC的分析可以很清楚的看出这点。
六、适用环境:
 1.需要生成的产品对象有复杂的内部结构。
 2.需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
 3.在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
参考文献:
《.NET应用架构设计原则、模式与实践》 王洋 著

转载于:https://www.cnblogs.com/Abel-Zhang/p/BuilderPattern.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一学:如何转换png图片为jpg图片

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 128 篇文章,本文大约 800 字,阅读大约需要 3 分钟背景最近在工作中会遇到需要将 png 图片转换为 jpg 图片的需求,主要原因也是 png 图片占的空间太…

python 数据模型

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 129 篇文章,本文大约 4500 字,阅读大约需要 15 分钟最近开始阅读《流畅的python》,也会开始更新这本书的学习笔记第一篇的内容是第一章 python 数…

每日一学:如何用matplotlib展示图片

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 130 篇文章,本文大约 1000 字,阅读大约需要 5 分钟前言今天简单介绍如何通过 matplotlib 展示图片,分为以下几种情况:直接用 matplotli…

每日一学:如何读取网络图片

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 131 篇文章,本文大约 1300 字,阅读大约需要 3 分钟前言有时候我们需要读取的图片是网络上的图片,应该怎么操作呢?这里也是介绍两个常用…

编写高效的PyTorch代码技巧(上)

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 132 篇文章,本文大约 7000 字,阅读大约需要 20 分钟原文:https://github.com/vahidk/EffectivePyTorch作者:vahidk前言这是一份 PyTorc…

编写高效的PyTorch代码技巧(下)

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 133 篇文章,本文大约 3000 字,阅读大约需要 15 分钟原文:https://github.com/vahidk/EffectivePyTorch作者:vahidk前言这是一份 PyTorc…

2020年计算机视觉学习指南

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 134 篇文章,本文大约 3000 字,阅读大约需要 10 分钟原文:https://towardsdatascience.com/guide-to-learn-computer-vision-in-2020-36f19d92c934作…

是选择Keras还是PyTorch开始你的深度学习之旅呢?

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 135 篇文章,本文大约 7000 字,阅读大约需要 20 分钟原文:https://medium.com/karan_jakhar/keras-vs-pytorch-dilemma-dc434e5b5ae0作者&#xff1…

关于myeclipse打开jsp巨慢解决方案

作为企业级开发最流行的工具,用Myeclipse开发java web程序无疑是最合适的,java web前端采用jsp来显示,myeclipse默认打开jsp的视图有卡顿的现象,那么如何更改jsp默认的打开方式,让我们可以进行更快速的jsp开发呢? 简单…

event

听取了网友:kenwang的意见,我的Blog在记流水账啊,现在才发现我发表的都是代码,一个感想也没有,以后要慢慢改正。明天要培训公司的框架,后天要搬家,这个周未没有得休息。

60分钟快速入门PyTorch

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 136 篇文章,本文大约 26000 字,阅读大约需要 60 分钟PyTorch 是由 Facebook 开发,基于 Torch 开发,从并不常用的 Lua 语言转为 Python …

[libGDX游戏开发教程]使用libGDX进行游戏开发(12)-Action动画

前文章节列表:使用libGDX进行游戏开发(11)-高级编程技巧 使用libGDX进行游戏开发(10)-音乐音效不求人,程序员也可以DIY 使用libGDX进行游戏开发(9)-场景过渡使用libGDX进行游戏开发(8)-没有美工的程序员,能够依赖的还有粒子系统 使用libGDX进…

将DataSet中的操作更新到Access数据库

代码如下&#xff1a;<%import Namespace Namespacesystem.data%><%import Namespace Namespacesystem.data.oledb%><script languagevb runatserver>Sub page_load()sub page_load() dim strConnection as string dim strSQL as string dim ob…

@synthesize obj=_obj的意义详解 @property和@synthesize

本文转载至&#xff1a;http://blog.csdn.net/showhilllee/article/details/8971159我们在进行iOS开发时&#xff0c;经常会在类的声明部分看见类似于synthesize window_window; 的语句&#xff0c;那么&#xff0c;这个window是什么&#xff0c;_ window又是什么&#xff0c;两…

Github项目推荐|可视化 GAN 的训练过程

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 137 篇文章&#xff0c;本文大约 1000 字&#xff0c;阅读大约需要 5 分钟今天介绍的一个开源的 github 项目&#xff0c;主要是实现了对 GAN 训练过程的可视化代码&#xff0c;项目链…

Github|类别不平衡学习资源(上)

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 138 篇文章&#xff0c;本文大约 5400 字&#xff0c;阅读大约需要 15 分钟今天推荐的是一个 github 项目&#xff0c;项目地址如下&#xff0c;主要是类别不平衡学习的论文、代码、框…

Github|类别不平衡学习资源(下)

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 139 篇文章&#xff0c;本文大约 3600 字&#xff0c;阅读大约需要 10 分钟继续介绍类别不平衡学习资源&#xff0c;github 地址&#xff1a;https://github.com/ZhiningLiu1998/awes…

Github | 线稿自动上色

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 140 篇文章&#xff0c;本文大约 1500 字&#xff0c;阅读大约需要 5 分钟今天要介绍的是一个 Github 项目&#xff0c;项目地址如下&#xff0c;它实现了对线稿的自动上色功能&#…

如何在图片上添加文本信息

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 141 篇文章&#xff0c;本文大约 1500 字&#xff0c;阅读大约需要 5 分钟前言给图片添加文本信息是非常常见的需求&#xff0c;通常需要添加的文本信息分为中文文字或者是非中文的文…