java设计模式中不属于创建型模式_Java设计模式(5)——创建型模式之建造者模式(Builder)...

一、概述

概念

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。(与工厂类不同的是它用于创建复合对象)

UML图

f230dc4229a27e497deac466888e213d.png 

0af4efe70e47949878072b83b1807b27.png

主要角色

抽象建造者(Builder)——规范建造方法与结果返还方法

具体建造者(Concrter Builder)——实现抽象建造接口,给出具体建造并返还具体结果

指导者(Director)——调用建造者,与客户端对接

产品(Product)——具体产品

二、实践

很多时候,一些建造的过程是需要有顺序建造的,一个产品的零件组装也有先后之分(以上一节工厂中的为例,内存和处理器可能会需要一个顺序,比如先处理器后内存)。这个时候就需要使用建造者模式了。建造者模式也是为了之前一直提到的解耦——将构建的复杂过程剥离开。

按照上面的角色划分使用Java来表示:

抽象建造者

/*** 抽象建造者

* 作者: Administrator

* 日期: 2017/10/27

**/

public interfaceBuilder {voidbuildPart1();voidbuildPart2();/*** 将以上的部件组装,返回组装后的产品

*@return

*/Product retrieveResult();

}

具体建造者

/*** 具体创建者

* 作者: Administrator

* 日期: 2017/10/27

**/

public class ConcreteBuilder implementsBuilder{

Part part1,part2;

@Overridepublic voidbuildPart1() {//构建部件1

}

@Overridepublic voidbuildPart2() {//构建部件2

}

@OverridepublicProduct retrieveResult() {//返回组装后的成品

return null;

}

}

指导者(导演)

/*** 指导者(导演)

* 作者: Administrator

* 日期: 2017/10/27

**/

public classDirector {privateBuilder builder;publicDirector(Builder builder) {this.builder =builder;

}public voidconstruct() {

builder.buildPart1();

builder.buildPart2();

}

}

产品与部件

/*** 产品

* 作者: Administrator

* 日期: 2017/10/27

**/

public interfaceProduct {

}

/*** 产品部件

* 作者: Administrator

* 日期: 2017/10/27

**/

public interfacePart {

}

客户端使用——通过指导者来指导建造,具体建造者返回对象

客户端只需要建造者和指导者即可得到产品!

只要给出导演(包工头),和具体建造者(工人),我就可以按照盖楼先从地基打起再做一楼、二楼的顺序盖一座大楼!(注意细节的关注)

public static voidmain(String[] args) {

ConcreteBuilder builder= newConcreteBuilder();

Director director= newDirector(builder);

director.construct();

Product product=builder.retrieveResult();

}

三、改进与思考

多个产品的拓展

17c8426fa843cf3235135088e1b7181d.png

适用性的思考

这里直接引用《Java与模式》之中的讲述

71553df819b6819a44796650370eace3.png

与工厂模式的区别

引用自CSDN论坛:

工厂方法方法应该算是一种思想,即对于一个易变的、目前不确定的东西做个接口,留给以后实现,这样可以达到某种程度的解耦。

抽象工厂也有接口,但它倒不是出于难以确定的目的,而是因为复杂而封装为接口供使用。举个例子来说,桌子由桌面和桌脚两部分组成,

桌面有圆形和方形两种,桌脚有三脚和四脚两种,我们可以封装出一个叫“书桌”的东西供客户使用,只要是说到“书桌”就是指四脚的方桌。

建造者也是一种封装,只是它封装的是过程。举例来说,钢材可以生产出棒材和钢管两种产品,这两种产品开始总要经过轧机,

最后总要冷却,它们中间也可能有相同的工艺,但我们还是分别把它们封装为棒材流水线和钢管流水线,而不是通过“到某某环节时用某某工艺

”来控制它们的生产流程。

抽象工厂和建造者都是对复杂东西的封装,使得用户看起来或使用起来简单,只是一个封装的是结构性的东西,

另一个封装的是过程性的东西。这都是oo的封装和接口的思想的运用。

设计模式这个东西就像张无忌学的太极拳,招式只是为了领会精要,一旦领会,就要把具体的招式忘掉。不要拘泥于设计模式的具体形式。

再看《Java与模式》中的阐述:

抽象工厂简略图:

4093e80f03eb021d40ce81d6bc7c3555.png

建造者模式简略图见文首

区别:

039c2030b4d6c825b652d5c7ad0325a6.png

524a2ac1719c35caa773dc046a5837dd.png

(类似于生产内存和处理器 VS生产手机的例子,内存和处理器可以再组合)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值