小成的注塑厂生产塑料产品时,往往是要经过一条生产流水线,才把原料加工成产品。小成一想,这不是很符合刚刚看到的建造者模式吗,于是他啪啪啪就写下代码。
介绍
和工厂模式一样,建造者模式也是一种对象创建型模式,但是建造者模式则是侧重于保持一个对象创建过程的稳定性。建造者模式的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。有些对象会有一些重要的性质,有些性质甚至要按一定顺序配置,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。建造者模式就可以一步一步按顺序创建一个复杂的对象,它允许用户只给出指定复杂对象的类型和内容就可以构建它们,建造者模式把内部的建造过程和细节隐藏起来,用户不需要知道。
建造者模式的两个重要部分:
- Director:负责“指导”Builder的创建对象,就是定义了如何构建各个部件,配置对象的各种属性。
- Builder:负责创建对象,含有创建对象的方法。
总的来说,就像在学校的实验室做实验一样,老师(Director)指导学生(Builder)做实验,做出实验结果(Product)。
package scut.designmodel.BuilderPattern;
//产品生产线抽象类
abstract class Builder{
public abstract void GetMaterial();
public abstract void Making();
public abstract Product Getresult();
}
//产品类
class Product{
public void Show(){
System.out.println("生产出了产品");
}
}
//产品生产线
class ProductBuilder extends Builder{
private Product product = new Product() ;
@Override
public void GetMaterial() {
System.out.println("获取产品原料");
//这里进行获取操作...
}
@Override
public void Making() {
System.out.println("制造产品");
//这里进行制造操作...
}
@Override
public Product Getresult() {
return product;
}
}
//控制者类
class Controler{
public void Construct(ProductBuilder builder){
builder.GetMaterial();
builder.Making();
}
}
//使用生产流水线
public class BuilderPattern {
public static void main(String[] args){
ProductBuilder mProductBuilder = new ProductBuilder();
Controler mControler = new Controler();
//生产产品
mControler.Construct(mProductBuilder);
Product product = mProductBuilder.Getresult();
product.Show();
}
}
结果:
获取产品原料
制造产品
生产出了产品
小成的建造者模式代码中,Controler就是Director,每个产品生产的流程要按顺序执行GetMaterial()、Making(),先获得材料再进行制造,所以就由Controler控制流程,Controler里面的Construct()方法按顺序执行操作,成功生产出产品。
应用场景
当需要将一个复杂对象的构建过程和细节隐藏,与这个对象的表示想分离,以达到同样的构建过程创造出不用的表示时,就可以使用建造者模式。
事实上,在一些项目中经常需要构建一些比较复杂的对象并对其多个属性进行复制的复杂操作,而且有对象的有些属性相互依赖,必须先配置一个属性再配置另外的的情况,如Android源码里面的AlertDialog.Builder和Retrofit2.0的Retrofit对象的构建,就是用了建造者模式。
优点
- 封装性很好。建造者模式把对象建立的操作全部封装在Builder和Director里面。使用者不用知道对象的构建过程。
- 扩展很容易。建造者是独立的,想要扩展只需要建立一个新的建造者就行了,符合开放封闭原则(对扩展的开放,对修改的关闭)。
- 便于控制细节风险。由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
缺点
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,所以针对特别灵活的生产过程和差异性很大的产品建造者模式就不是很适合了。
参考:
- http://www.hollischuang.com/archives/1477
- 《设计模式其实很简单》,刘径舟,张玉华等编著——清华大学出版社,2013.7