建造者模式(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 {@Overridepublic 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();@Overridepublic void buildBoard(String board) {mComputer.setBoard(board);}@Overridepublic void buildDisplay(String display) {mComputer.setDisplay(display);}@Overridepublic void buildOS() {mComputer.setOS();}@Overridepublic 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源码设计模式》
技术文章:菜鸟教程-设计模式
