学习rabbitmq,在看其java client api文档时,讲到AMQP类的请求、应答描述符都有builder类,符合Builder模式,让创建协议对象更加简单,允许使用不变的状态创建他们。
一直没有系统学习设计模式,从网上查了一下Builder模式的讲解,中文资料中讲builder模式的基本是人云亦云,拿着翻译的半通不通的所谓中文标准定义,按照自己的例子理解一番,然后写一个简单的小例子,算是搞定。看到那些为了模式而模式的别扭代码,根本看不出builder模式到底有什么好的。
这些例子一般是这样的,定义一个Director类,定义一个Builder接口。其中Builder接口有几个createPart1()、createPart2()这样的方法,最后必定有一个getResult()方法返回一个Product对象。而Director类呢,构造时传进一个Builder接口,然后有一个construct方法,里面依次调用builder接口的那几个create方法完事。
builder模式根本就不是为这些创建过程很简单的例子准备的,这些例子代码使用builder模式有点“为赋新词强说愁”的感觉,怎么看怎么别扭。看这些例子的用意,是想把对象的创建过程提取到一个叫做Director的类里,这样做有几个前提,才能保证这种提取有意义:
1. 创建过程比较普适,有多种Product的创建过程都是一模一样的。
2. 创建过程比较复杂,有特殊的顺序和逻辑要求,或者是有非常复杂的参数列表,否则如果就是一两行简单代码,抽象出来没有意义。
这些例子中,基本都不满足这两个前提,比如有个配套餐的例子,说套餐A是xxx,套餐B是yyy,可以建立两个Builder,分别生产套餐需要的各种配菜,另外建一个Director类调用Builder中相应的方法生成套餐。这不是完全多余的吗?Director中的过程根本不能通用,谁规定两个套餐必须使用同样的方式创建的?
在AMQP.BasicProperties.Builder.build()方法中,封装了对BasicProperties构造函数的调用。这个调用非常复杂,有14个参数:
public BasicProperties build()
{
return new BasicProperties(contentType, contentEncoding, headers, deliveryMode, priority, correlationId, replyTo, expiration, messageId, timestamp, type, userId, appId, clusterId);
}
这个封装是比较有意义的。而是用这种方式的主要原因是,builder的所有其他方法都是给自己设置属性,这样可以在任何时刻调用build把自己的一份拷贝生成为BasicProperties。
分享到:
相关推荐
Builder模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 统设计中,有时候面临着一个“复杂系统”的创建工作,该对象通常由各个部分的子对象用一定的算法构成,或者说按一定的...
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数...
23种设计模式之四(创建型模式)Builder模式
【Java面试题】builder模式
BUILDER模式 C++实现
demo中使用了设计模式中的建造者模式,代码非常精简,本地可正常运行,亲测有效!
NULL 博文链接:https://wy649898543.iteye.com/blog/1431751
FreeBuilder为 Java 1.6 自动生成 Builder 模式。当设计类的构造函数或静态工厂具有多个参数时,Builder 模式是一个不错的选择。—— Effective Java,第二版,第39页背景在 Java 中实现 Builder 模式容易出错和...
东北大学设计模式实验 实现单例模式,组合模式,Builder模式,装饰器模式,并使用设计模式实现赌场
软件体系结构Builder模式浅谈PPT形式
用于学习android java builder模式
NULL 博文链接:https://chaimzane.iteye.com/blog/337212
FreeBuilder 为 Java 1.6 自动生成 Builder 模式。 当设计类的构造函数或静态工厂具有多个参数时,Builder 模式是一个不错的选择。
Builder模式Demo
Builder模式代码-一个java类 Builder模式代码-一个java类
使用Builder模式设置字体大小、颜色、位置的属性
通过builder来实现自定义顶部导航topbar,内含builder模式实现的simple.http://blog.csdn.net/qq_28690547/article/details/50493099实现同步博文
Java设计模式:Builder模式应用案例[整理].pdf