设计模式之--生成器(builder)模式(学习分析笔记)

分析原则:封装变化

BUILDER(生成器)—对象创建型模式

1. 意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

解读:1.从意图中已经可以比较明显的看出此模式的要点。“复杂对象的构建”与“表示”(可以理解为各种对象),这两个封装点,也即变化

             2.“同样的构建过程可以创建不同的表示”进一步阐明“生成器”,即替换不同的生成器即可产生不同对象。

举个例子来说明好了,比如生成自行车是一个复杂的创建过程。我这里暂时将它分成:1、创建车把 handlebar();2、创建车架 frame();3、创建轮子 wheel();并且生成器知道如何组合各个部分,这同时也是生成器的责任之一。好了,那么现在就可以将构建算法和表示分离。方便构建算法和表示独立变化,我们就达到解耦的效果了。

假设构建算法:2 handlebar + 1 frame + 1 wheel 对应独轮车生成器:unicycleBuilder  =  生成独轮自行车

再举一例构建算法和生成器独立变化:

                          2 handlebar  +  1 frame +  3 wheel  对应三轮自行车生成器:tricycleBuilder = 三轮车

或者固定构建算法,同样的构建过程可以创建不同的表示:

                         2 handlebar  +  1 frame +  2 wheel  对应公路自行车builder = 公路自行车

                         2 handlebar  +  1 frame +  2 wheel  对应山地自行车builder = 山地自行车

                         2 handlebar  +  1 frame +  2 wheel  对应电动自行车builder = 电动自行车

举这些例子只为说明原理,简单理解不需深入抠门。下面才是正题

2. 适用性
在以下情况使用B u i l d e r模式
• 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
• 当构造过程必须允许被构造的对象有不同的表示时。
3. 结 构

4.参与者


• B u i l d e r

— 为创建一个P r o d u c t对象的各个部件指定抽象接口。

• C o n c r e t e B u i l d e r

— 实现B u i l d e r的接口以构造和装配该产品的各个部件。
— 定义并明确它所创建的表示。
— 提供一个检索产品的接口

• Director
— 构造一个使用B u i l d e r接口的对象。


• P r o d u c t

—表示被构造的复杂对象。C o n c r e t e B u i l d e r创建该产品的内部表示并定义它的装配过程。
— 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

5.实现
通常有一个抽象的B u i l d e r类为导向者可能要求创建的每一个构件定义一个操作。这些操
作缺省情况下什么都不做。一个C o n c r e t e B u i l d e r类对它有兴趣创建的构件重定义这些操作。
这里是其他一些要考虑的实现问题:
1)  装配和构造接口 生成器逐步的构造它们的产品。因此 B u i l d e r类接口必须足够普遍,以便为各种类型的具体生成器构造产品。一个关键的设计问题在于构造和装配过程的模型。构造请求的结果只是被添加到产品中,通常这样的模型就已足够了。

2) 为什么产品没有抽象类 通常情况下,由具体生成器生成的产品,它们的表示相差是如此之大以至于给不同的产品以公共父类没有太大意思。因为客户通常用合适的具体生成器来配置导向者,客户处于的位置使它知道 B u i l d e r的哪一个具体子类被使用和能相应的处理它的产品。


3 ) 在B u i l d e r中却省的方法为空 C + +中,生成方法故意不声明为纯虚成员函数,而是把它们定义为空方法,这使客户只重定义他们所感兴趣的操作。

相关模式
Abstract Factory与B u i l d e r相似,因为它也可以创建复杂对象。主要的区别是B u i l d e r模式着重于一步步构造一个复杂对象。而 Abstract Factory着重于多个系列的产品对象(简单的或是复杂的) 。B u i l d e r在最后的一步返回产品,而对于 Abstract Factory来说,产品是立即返回的。C o m p o s i t e通常是用B u i l d e r生成的。

生成器模式并不多见,至少我们项目中没有用到。但是多学习一种模式,就会多一些思想。将来总会有用武之地

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值