建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。建造者模式将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
场景
- 相同的方法,不同的执行顺序,产生不同的事件结果
- 一些基本部件不会变,而其组合经常变化的时候
实现
源码来自:《Android源码设计模式解析与实战》
角色介绍
- Product 产品类 : 产品的抽象类
- Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程
- ConcreteBuilder : 具体的构建器
- Director : 统一组装过程(可省略)
创建产品抽象类
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
public void setBoard(String mBoard) {
this.mBoard = mBoard;
}
public void setDisplay(String mDisplay) {
this.mDisplay = mDisplay;
}
public abstract void setOS();
}
创建具体的产品类
public class Macbook extends Computer {
@Override
public void setOS() {
mOS = "Mac OS";
}
}
创建抽象Builder
public abstract class Builder {
public abstract void buildBoard(String board);
public abstract void buildDisplay(String display);
public abstract void buildOS();
public abstract Computer create();
}
创建具体的Builder类
public class MacbookBuilder extends Builder {
private Computer mComputer = new Macbook();
@Override
public void buildBoard(String board) {
mComputer.setBoard(board);
}
@Override
public void buildDisplay(String display) {
mComputer.setDisplay(display);
}
@Override
public void buildOS() {
mComputer.setOS();
}
@Override
public Computer create() {
return mComputer;
}
}
创建Director
public class Director {
Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct(String board, String dispaly) {
builder.buildBoard(board);
builder.buildDisplay(dispaly);
builder.buildOS();
}
}
通过具体的MacbookBuilder来构建Macbook对象,而Director封装了构建复杂产品的过程,对外隐藏构建细节。
实际开发中,Director一般会忽略,而直接使用一个Builder,这个Builder一般为链式调用,如:
new Builder()
.setA("A")
.setB("B")
.create();
优点
- 良好的封装性, 使用建造者模式可以使客户端不必知道产品内部组成的细节
- 建造者独立,容易扩展
- 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响
- 可以实现参数可选的功能,使用Builder链式调用只传递部分参数
缺点
- 会产生多余的Builder对象以及Director对象
- 产品必须有共同点,范围有限制
Android 中的应用
- AlertDialog 弹窗组件
参考
书籍:《设计模式之禅》、《Android源码设计模式》
技术文章:菜鸟教程-设计模式