面向对象设计模式_生成器模式解读(Builder Pattern)
首先提出一个很容易想到应用场景:
手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否配置附件。假设手机的生产过程(这里用方法来代替)可以是几千个方法的叠加过程,每个方法都面临不同的变化,如果将手机的生产过程中的这些方法全部耦合在一个对象里实现,显然是不明智的。
教材书上对生成器模式的解释:生成器模式将复杂对象的构建过程和表示(实现)相分离,使得相同的构建过程可以创建不同的表示。如下图

这里解析一下:"构建过程"(Construct)实则是抽象部分,即稳定的过程框架,它一般不会变化,就像模型中的foreach代码一样,这句代码唯一关联了对象的自身属性(Builders是接口类型IBuilder的集合),仅仅与抽象的接口关联,这完全符合DIP(依赖倒置)原则。手机的生产我们可以抽象成:摄像头生产,电路板生产,......组装手机。这些抽象都是比较稳定的。
“不同的表示”,可以理解为,将这些抽象的过程具体化,并可以用不同的组合形式,顺序来构建(Construct),比如,我可以先生产A,再生产B,然后组装,也可以先B后A,等等。
代码示例:生产一个有很多部件的产品
public class Director
{
//产品架构 //先生产10个部件1
//其次再生产4个部件2
//组装产品
public List<IBuilder> Builders { get; set; }//将具体过程按序封装到该集合中
public Director()
{
Builders = new List<IBuilder>();//仅依赖抽象接口
}
public void Construct()
{
foreach (IBuilder b in Builders)//这句代码是非常稳定的,它唯一依赖唯一的自身属性Builders
{
b.BuildPart();
}
}
}
//对每个部件生产的抽象(这个接口算是最抽象级的抽象了)
public interface IBuilder
{
void BuildPart();//每个Builder代表一个部件生产
} //实例化部件的生产过程
public class Part1Builder : IBuilder
{
public void BuildPart()
{
Console.WriteLine("完成部件1的生产!");
}
} //
public class Part2Builder : IBuilder
{
public void BuildPart()
{
Console.WriteLine("完成部件2的生产!");
}
}
//对组装过程实例化
public class ProductBuilder : IBuilder
{
public void BuildPart()
{
Console.WriteLine("完成产品组装!");
}
} //测试代码
class Test
{
static void Main(string[] args)
{
Director director = new Director();
for (int i = 0; i <10; i++)
{
director.Builders.Add(new Part1Builder());
}
director.Builders.Add(new Part2Builder());
director.Builders.Add(new ProductBuilder());
director.Construct();
Console.ReadKey();
}
}
有些人对生成器模式有另一种解读,如下图所示:

将抽象的构建过程的实现通过一个实例来实现,接口(IBuilder)中抽象了每一个子过程,每个实现类(ConcreteBuilder)代表一个不同的表示,是一个具体的构建过程。这样当客户需要一种新的形式产品时,就可以具体化一个新的类(ConcreteBuilder)来实现不同的过程(实现抽象化接口),然后在Director的构建方法(Construct)中调用。这实际上比上面一种解读模式稍微提高了些耦合度,同时在统一的接口中的提供很多抽象方法,实际上违背了单一职责原则(职责:变化的原因),扩展修改将变得比较繁重。
上面的两个类图不同之处在于前者使用类对象实现不同的子过程,后者在统一的接口中抽象每个子过程。后者在Director中方法对每个具体实现有所依赖。前者实际解耦性更高。
面向对象设计模式_生成器模式解读(Builder Pattern)的更多相关文章
- 面向对象设计模式_生成器模式详解(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- C#设计模式(5)——建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- C#设计模式:建造者模式(Builder Pattern)
一,建造者模式(Builder Pattern) using System; using System.Collections.Generic; using System.Linq; using Sy ...
- 面向对象设计模式_命令模式(Command)解读
在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)
定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...
- Java设计模式之建造者模式(Builder Pattern)
前言 这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点. 一.建造者介绍 用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现 ...
- 深入浅出设计模式——建造者模式(Builder Pattern)
模式动机无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单 ...
随机推荐
- HDU4825 Xor Sum (01Trie)
Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...
- Akka(42): Http:身份验证 - authentication, authorization and use of raw headers
当我们把Akka-http作为数据库数据交换工具时,数据是以Source[ROW,_]形式存放在Entity里的.很多时候除数据之外我们可能需要进行一些附加的信息传递如对数据的具体处理方式等.我们可以 ...
- 【Vue】【Router】手动跳转用 this.$router.push() 时 $router 未定义的问题
初入Vue,手写路由跳转时的问题: toXxxRoute: () => { this.$router.push({'path': '/xxx', 'name': 'xxx'}) } 由于使用了箭 ...
- Redis---quickList(快速列表)
1. 概述 考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节 (64bit 系统的指针是 8 个字节),另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理 ...
- Python程序的打包-上传到pypi
pypi注册与配置 在pypi的官网:https://pypi.python.org/pypi 注册自己的账号激活账号之后,我们还需要将在本地配置一份文件 在用户的根目录创建文件 : .pypirc在 ...
- Runtime 全方位装逼指南
Runtime是什么?见名知意,其概念无非就是“因为 Objective-C 是一门动态语言,所以它需要一个运行时系统……这就是 Runtime 系统”云云.对博主这种菜鸟而言,Runtime 在实际 ...
- odoo开发笔记:Server+Action服务器动作自动触发执行
Odoo的市场定位是SME(中小型企业),这个市场的ERP产品,多如牛毛,产品各具特色.不过,Odoo的自动化处理机制,可以睥睨天下,无人能及.包括一些大型国产软件,如用友.金蝶也不具备 ...
- Android开发中实现https校验
在安卓开发中需要自己写代码实现校验公钥的功能 当然, 如果是自己服务器,就不用校验, 如果是别人的服务器,比如银行,就需要校验 在这里, 小编采用从github上下载的开源框架实现,在开源框架中添加 ...
- springboot-29-security(二)用户角色权限控制
本博客基于上一个http://www.cnblogs.com/wenbronk/p/7379865.html 增加了角色的权限表, 可以进行权限校验 一, 数据准备 1, 数据表建立 /* Navic ...
- ELK之filebeat
1.概述 filebeat使用go语言开发,轻量级.高效.主要由两个组件构成:prospector和harvesters. Harvesters负责进行单个文件的内容收集,在运行过程中,每一个Harv ...