作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
1.概述
这个模式在Head First中没有介绍,大概是因为这个模式和工厂模式有点像。其目的主要是通过创建简单的对象构建一个复杂的对象。
2.举例
举一个例子:创建汽车的相关指标说明。
首先我们创建一个汽车的类:
在上边的这个例子中,关于一个汽车的指标说明有三项:Power Steering、Power Window和Price。
然后我们创建一个创建汽车的类CarBuilder :
现在我们创建两个具体汽车类型的创建者:Alto_LX 和 Alto_LXI
最后我们再写一个创建说明并生产汽车的类,这个类组合了具体生产汽车的类,所以该类的一个作用就是生产一部汽车(因为组合而得到的能力),另一个作用是为这个汽车创建相关指标说明(这也是因为组合得到的能力,同时也是进行了封装后提供的接口):
现在我们就可以造两辆带有指标说明的车了:
我们可以看到,首先我们实例化了一个创建说明的类,并且实例化了两个生产汽车的类。随后利用创建汽车能力的创建说明类来完成说明和汽车的构造。
抽象一下,UML图为:
本例中的Specification就是该图中Director。
3.与工厂方法(或抽象工厂方法)比较
该方法强调利用封装一步步完成一个复杂对象的构建,比如本例中的Specifications就是通过创建汽车、创建三项说明来完成汽车的最终构建的。而抽象工厂方法强调构建一系列产品对象,不管其复杂与否。另外,工厂方法还会根据传入的参数进行对象构建,这个建筑者模式中并没有。
在Effective Java, 2nd Edition中提到:The builder pattern is a good choice when designing classes whose constructors or static factories would have more than a handful of parameters.
我们经常见过这样设计的类:
你可以做如下改进:
这样做也有问题:通过若干步创建的pizza可能会导致对象创建的不完整,并且对于线程安全还需要多多考量。
此时我们可以使用构建者模式(此处使用嵌套类,其实和组合是一个效果):
现在我们创建一个Pizza就是如下的方式:
这个例子可以与工厂模式里面的例子对比一下,就知道这两个模式的区别了。
Java中的DocumentBuilderFactory , StringBuffer, StringBuilder 都是这个模式的例子。
在线视频:http://v.youku.com/v_show/id_XMjU2OTQ5Mzg4.html
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。