建造者模式(Builder)主要用来构建复杂的对象,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构建流程。
1、定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果。
- 多个部件或零件,都可以装配到一个对象中,但产生的结果不同。
- 产品类非常复杂,或者产品类中的调用顺序不同产生不同的结果。
- 当初始化一个对象特别复杂时,如参数多。
3、UML图
- Product:产品类
- Builder:建造器接口,定义创建一个Product对象所需的各个部件的操作。
- ConreteBuilder:具体的建造者
- Director:指导者,统一组装过程。
4、示例代码
/**
* 待构建产品
*/
public class Product {
String partA, partB, partC;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void setPartC(String partC) {
this.partC = partC;
}
@Override
public String toString() {
return "Product [partA=" + partA + ", partB=" + partB + ", partC="
+ partC + "]";
}
}
/**
* 建造器接口,定义创建一个产品对象所需的各个部件的操作
*/
public interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
public Product build();
}
/**
* 具体构建产品的建造器
*/
public class ConcreteBuilder implements Builder {
//建造器最后构建的产品对象
private Product mProduct = new Product();
@Override
public void buildPartA() {
System.out.println("buildPartA");
mProduct.setPartA("partA");
}
@Override
public void buildPartB() {
System.out.println("buildPartB");
mProduct.setPartB("partB");
}
@Override
public void buildPartC() {
System.out.println("buildPartC");
mProduct.setPartC("partC");
}
/**
* 获取建造器最后构建的产品对象
*
* @return
*/
public Product build() {
return mProduct;
}
}
/**
* 构建指导者,指导使用建造器的接口来构建产品对象
*/
public class Director {
private Builder mBuilder;
public Director(Builder builder) {
super();
this.mBuilder = builder;
}
/**
* 指导建造器构建最终的产品对象
*/
public void construct() {
mBuilder.buildPartA();
mBuilder.buildPartB();
mBuilder.buildPartC();
}
}
//测试
public class Test {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
//封装了具体的构建过程
director.construct();
Product product = builder.build();
System.out.println("最终的产品:" + product.toString());
}
}
测试结果:
在Android源码中最常用到Builder模式就是AlertDialog.Builder,Builder模式可以避免过多的setter方法。比较常见的实现形式是通过调用链实现,使代码更简洁、易懂。