1,概念
封装一个产品的构造过程并允许按步骤构造(有多个步骤,工厂模式只有一个步骤,所以两者不同),并可以改变过程,这个过程对用户来说是透明的。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2,场景
- 要创建的对象参数很多,使用构造函数会出现参数列表很长的问题;
- 对象需要多个属性综合校验,不能只在单个set方法中校验;
- 多属性间有依赖关系;
- 对象属性在创建好之后就不能修改;
- 不能创建无效对象;
- 相同的方法,不同的执行顺序,产生不同的事件结果时;
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
3,类图
1)指挥者(Direct)
用于构建一个使用Builder接口的对象。
主要作用:
- 隔离用户与对象的生成过程
- 负责控制产品对象的生产过程(但不生产)
2)建造者(Builder)
声明了具体建造者的公共接口(产品的建造过程、返回产品的方法)
3)具体建造者(ConcreateBuilder)
实现Builder接口来创建具体产品。
4)具体产品(Product)
建造后的对象。
4,优缺点
1)优点
对用户透明
良好的封装性, 使用建造者模式可以使客户端不必知道产品内部组成的细节;
可读性
创建对象时属性设置清晰,可读性较高
扩展性
建造者独立,容易扩展;
2)缺点
会产生多余的Builder对象以及Director对象,消耗内存;
对象的构建过程复杂;
开发效率不高,没有new对象简单粗暴。
5, demo
6,举例
1)Android源码中的模式实现
在Android源码中,我们最常用到的Builder模式就是AlertDialog.Builder, 使用该Builder来构建复杂的AlertDialog对象。