`

二十七:建造模式

阅读更多
一:什么是产品内部表象和建造模式

一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品对象有哪些零件,每个产品对应的零件彼此有何不同,是怎么建造出来的,以及怎么样组成产品.即:
建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程具有不同的内部表象的不同产品对象.

二:对象性质的建造
有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,比如,一个电子邮件有发件人地址,收件人地址,主题,内容,附录等部分,而在最起码的收件人地址得到赋值之前,这人电子邮件不能发出。有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义,在某个性质没有赋值之前,另一个性质无法赋值,这些情况使得性质本身的建造涉及到复杂的商业逻辑,这时候,此对象相当于一有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程是建造零件的过程,由于建造零件的过程复杂,因此,这些零件的建造过程往往被"外部化"到另一个称作建造者的对象里,建造者对象返回给客户端的是一个全部零件都建造完毕的产品对象。

三:建造模式中的角色
此模式涉及到四种角色,它们分别是:
A:抽象建造者(Builder)角色--给出一个抽象接口,以规范产品对象的各个组成成分的建造,此接口独立于应用程序的商业逻辑,模式中直接创建产品对象的是具体建造者(ConcreateBuilder)角色,具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(源码中的builderPart1和buildPart2),另一种是结果返回方法(源码中的retrieveResult),一般来说,产品所包含的零件数目与建造方法的数据相符,换言之,有多少零件,就有多少相应的建造方法
B:具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例,这个角色要完成的任务包括:
(1)实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作
(2)在建造过程完成后,提供产品的实例。
(3)导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象,应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色
(4)产品(Product)角色:一个系统中会有多于一个的产品类,这些产品类并不一定有共同的接口.
以上四个角色中,导演者角色是与客户端打交道的角色,导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体的建造者角色。一般来说,每有一个产品类,就有一个相应的具体建造者类,这些产品应当有一样的数目的零件,而每一个零件就相应地在所有的建造者角色里有一个建造方法

四:源码
package cai.milenfan.basic.test; 

public class Director { 
private Builder builder; 
//产品构造方法,负责调用各个零件建造方法
public void construct(){ 
builder = new ConcreteBuilder(); 
builder.buildPart1(); 
builder.buildPart2(); 
builder.retrieveResult(); 
//other code........... 
} 
} 

package cai.milenfan.basic.test; 
//抽象建造者通常与应用系统的商业逻辑无关,因此可以用java的抽象类或接口
abstract public class Builder { 
//产品零件建造方法
public abstract void buildPart1(); 
public abstract void buildPart2(); 
//产品返回方法
public abstract Product retrieveResult(); 
} 

package cai.milenfan.basic.test; 
//具体建造者是与应用系统的商业逻辑密切相关的,因此这里仅仅给出了一个骨架
public class ConcreteBuilder extends Builder{ 
private Product product = new Product(); 
public void buildPart1() { 
//your code........... 
} 
public void buildPart2() { 
//your code.... 
} 
public Product retrieveResult() { 
return product; 
} 
} 

package cai.milenfan.basic.test; 

public class Product { 
//it is your product...... 
} 

上面的系统中只有一个产品类Prodcut,对应也只一个具体建造者类ConcreteBuilder,如果有两个产品类的话就应当有两个具体建造者类.....客户端通过建造者接口生成具有不同的内部表旬的Product1和Product2的对象。

五:标识接口的应用.
由上面的例子知道,retrieveProduct()方法是抽象建造角色提供的,如果它返回的是Product1类型或者Product2类型,那么ConcreteBuilder1或者ConcreteBuilder2就会有问题,因为它们应当返回Product1和Product2类型,解决的方案是为两个具体的类提供一个共同的接口,形成它们共同的类型,由于建造模式的产品类往往是没有太多关系的一些类,因此,它们也不太可能有共同的接品,这样使用一个标识接口为所有的具体产品类提供一个共同的类型就成为解决问题的方案,即所有的retrieveProduct方法都返回Product类型就可以了。

六:JavaMail中的建造模式
跳过
七:一个发送邮件的例子
跳过

八:在什么情况下使用建造模式
A:需要生成的产品对象有复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象的一个组成万分。
B:需要生成的产品对象的属性相互依赖,建造模式可以强制实行一种分步骤进行的建造过程,因此,如果一个产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式是一个很好的设计思想

九:建造模式与其他模式的关系
A:建造模式与抽象工厂模式的区别
在抽象工厂模式中,每一次工厂对象被调用时都返回一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造模式则不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色内部。建造模式的客户端拿到的是一个完整的最后产品。换言之,虽然抽象工厂模式与建造模式都是设计模式,但是抽象工厂模式处在更加具体的尺度上,而建造模式则处于更加宏观的尺度上。一个系统可以由一个建造者模式和一个抽象工厂模式组成,客户端通过调用这个建造角色,间接地调用另一个抽象工厂模式的工厂角色,工厂模式返回不同产品族的零件,而建造者模式则把它们组装起来.
B:建造模式与策略模式的区别
建造模式是策略模式的一种特殊情况,这两种模式的区别在于它们的用意不同.建造模式适用于为客户端一点一点地建造新的对象,而不同类型的具体建造者角色虽然都拥有相同的接口,但是它们所创建出来的对象则可能完全不同。策略模式的目的是为算法提供抽象的接口,换言之,一个具体的策略类把一个算法包装到一个对象里,而不同的具体策略对象为一种一般性的服务提供不同实现.

请你用建造模式解决下面一首女子写给丈夫的情诗:
一别之后,两地相思,三月桃花随水转,四月琵琶未黄,奴我欲对镜心却乱,五月石榴红似火,偏遇冷雨浇花端。六月伏天人人摇扇独我心寒。七弦琴无心弹,八行书无处传,九连环从中折断,十里长庭望眼欲穿.

提示:
导演者:丈夫建造者:妻子产品:思念
分享到:
评论

相关推荐

    Head First 设计模式 JAVA源码

    所有的设计模式Java实现。 第一讲:简单工厂模式 第二讲:工厂方法模式 第三讲:抽象工厂模式 ...第二十七讲:里氏转换原则 第二十八讲:依赖倒转原则 第二十九讲:迪米特法则 第三十讲:设计模式总结

    23种设计模式项目实例

    创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...

    设计模式PPT.rar

    22第二十二讲备忘录模式 23第二十三讲状态模式 24第二十四讲命令模式 25第二十五讲访问者模式 26第二十六讲开放封闭原则 27第二十七讲单一职责原则 28第二十八讲里氏代换原则 29第二十九讲依赖倒转原则 30第三十讲...

    12-附录 1 设计模式的七大原则(1).html

    在书中,作者们将这二十三种设计模式分成了三类,分别是创建型模式、结构型模式和行为型模式。 创建型模式包含了: 工厂方法模式( Factory Method ) 抽象工厂模式( Abstract Factory ) 单例模式( Singleton ...

    设计模式-7种开发语言(C#、JAVA、JavaScript、C++、Python、Go、PHP).pdf

    第一节 设计模式:学习顺序 第二节 简单工厂模式 第三节 工厂方法模式 第四节 抽象工厂模式 第五节 单例模式 第六节 外观模式 第七节 模板模式 第八节 组合模式 第九节 代理模式 第十节 命令模式 第十一节 观察者...

    DesignPattern:设计模式演示代码

    设计模式(七)-建造者模式 博客地址: : 08.设计模式(八)-原型模式 博客地址: : 09.设计模式(九)-单例模式 博客地址: : 10.设计模式(十)-适配器模式 博客地址: : 11.设计模式(十一)-合理模式 ...

    C++设计模式

    (一)简单工厂模式 2 (二)策略模式 4 策略与工厂结合 6 单一职责原则 6 开放――封闭原则 6 里氏代换原则 7 依赖倒转原则 7 (三)装饰模式 7 (四)代理模式 9 (五)工厂方法模式 11 ...(二十四)访问者模式 61

    Java基础知识点总结.docx

    单例设计模式:★★★★★ 156 工厂模式★★★★★ 159 抽象工厂模式★★★★★ 163 建造者模式 170 原型模式 177 适配器模式 182 桥接模式 188 过滤器模式 192 组合模式 193 装饰器模式★★★★★ 196 外观模式 201...

    asp.net知识库

    ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动返回上次请求页面(小技巧) ASP.NET 2.0 控件 ASP...

    人工智能原理介绍.pptx

    如何设计和制造更聪明的智能计算机 一门由计算机科学、控制论、信息论、语言学、神经生理学、心理学、数学、哲学等多种学科相互渗透而发展起来的综合性新学科 二十世纪七十年代以来世界三大尖端技术 (空间技术、...

    writing-an-os-in-rust:《使用Rust编写操作系统》

    七硬件中断待添加完毕21千字八内存分页简介待添加完毕16千字九内存分页实现待添加完毕28千字十堆分配待添加完毕20千字十一内存分配器设计待添加完毕35千字十二异步/等待待添加完毕51千字附录序号标题友情链接源文件...

    TCP/IP详解

    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...

    使用3x7段LED显示屏的反应计时器-电路方案

    大多数十进制计数器已将输出编码为二进制,但是4026B具有七个输出引脚,并以与7段显示器的引脚匹配的模式为它们供电。因此,不需要驱动程序即可将二进制转换为七段模式。 4026B的引脚布局如下: 引脚的用法如下: 引脚...

    TCP/IP教程TCP/IP基础

    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...

    TCP/IP技术大全

    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...

    C#微软培训资料

    第十七章 文 件 操 作 .215 17.1 .Net 框架结构提供的 I/O 方式 .215 17.2 文件存储管理 .217 17.3 读 写 文 件 .222 17.4 异步文件操作 .227 17.5 小 结 .234 第十八章 高 级 话 题 .235 18.1 注册表...

    TCP/IP技术大全(中文PDF非扫描版)

    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...

    TCP-IP技术大全

    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...

    TCPIP协议详解(4-1)

    命名和寻址 第4章 IP网络中的名字和地址 29 4.1 IP寻址 29 4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类...

Global site tag (gtag.js) - Google Analytics