定义
建造者模式(Builder Pattern):
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
译: 将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。
类图
图中的设计使用到了多态,其实我们类似写一个接口或抽象类,然后声明一些构造一个事物的所有属性方法,然后再实现不同的类,填充不同的属性值,这样,就可以构造出不同的产品来~
在开发中却比较少的严格遵循这种结构,比如安卓里面的AlertDialog.Builder使用的方法却比较常见。
优缺点及注意事项
1. 优点:
更好的封装内部结构,对使用者来说放心的去构造就好,不用担心顺序之类的问题,最后create就可以生成想要的事物。
2.缺点:
会产生过多的Builder对象及Director对象,消耗内存
3.注意事项:
设计好类的结构,避免过多的产生无用的类和临时对象,最后生成Product的时候,考虑好各种属性的default值
使用场景
类的属性很多,构造比较麻烦,参数过多,例如AlertDialog.Builder、StringBuilder
不同的执行顺序,产生不同的结果
实现方式
这里就不去实现上面类图的结构了,分享一下StringBuilder的方法(简单常用):
先来看一下平时我们的使用方式:
StringBuilder sb = new StringBuilder();
sb.append("string").append(1).append(true).append(1.0f);
通过使用方式来看,可以传递各种类型的值,然后使用这种链式的调用,使代码看起来非常简洁调用也很方便,很好的将各种重载的方法串到一起,然后得到我们最终的结果。ps:当然上面的代码可以优化为String 的+进行拼接
那里面是怎么实现的呢?
先随便看一下append方法:
public StringBuilder append(String str) {
super.append(str);
return this;
}
可以注意到:return this
,就是这个让我们可以进行链式调用,而其他的跟普通的没有什么两样,因此我们就可以模仿这种方式,构造参数较多的自定义类,例如之前的一篇博文实现:http://blog.csdn.net/yk3372/article/details/53053518 就是使用了这种方式,这样最后我们只要调用最后构造方法toString或create之类的方法,就可以得到我们想要的真实对象。