建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。建造者模式将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果
  • 一些基本部件不会变,而其组合经常变化的时候

实现

源码来自:《Android源码设计模式解析与实战》

角色介绍
  • Product 产品类 : 产品的抽象类
  • Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程
  • ConcreteBuilder : 具体的构建器
  • Director : 统一组装过程(可省略)

创建产品抽象类
  1. public abstract class Computer {
  2. protected String mBoard;
  3. protected String mDisplay;
  4. protected String mOS;
  5. public void setBoard(String mBoard) {
  6. this.mBoard = mBoard;
  7. }
  8. public void setDisplay(String mDisplay) {
  9. this.mDisplay = mDisplay;
  10. }
  11. public abstract void setOS();
  12. }

创建具体的产品类
  1. public class Macbook extends Computer {
  2. @Override
  3. public void setOS() {
  4. mOS = "Mac OS";
  5. }
  6. }

创建抽象Builder
  1. public abstract class Builder {
  2. public abstract void buildBoard(String board);
  3. public abstract void buildDisplay(String display);
  4. public abstract void buildOS();
  5. public abstract Computer create();
  6. }

创建具体的Builder类
  1. public class MacbookBuilder extends Builder {
  2. private Computer mComputer = new Macbook();
  3. @Override
  4. public void buildBoard(String board) {
  5. mComputer.setBoard(board);
  6. }
  7. @Override
  8. public void buildDisplay(String display) {
  9. mComputer.setDisplay(display);
  10. }
  11. @Override
  12. public void buildOS() {
  13. mComputer.setOS();
  14. }
  15. @Override
  16. public Computer create() {
  17. return mComputer;
  18. }
  19. }

创建Director
  1. public class Director {
  2. Builder builder;
  3. public Director(Builder builder) {
  4. this.builder = builder;
  5. }
  6. public void construct(String board, String dispaly) {
  7. builder.buildBoard(board);
  8. builder.buildDisplay(dispaly);
  9. builder.buildOS();
  10. }
  11. }

通过具体的MacbookBuilder来构建Macbook对象,而Director封装了构建复杂产品的过程,对外隐藏构建细节。

实际开发中,Director一般会忽略,而直接使用一个Builder,这个Builder一般为链式调用,如:

  1. new Builder()
  2. .setA("A")
  3. .setB("B")
  4. .create();

优点

  • 良好的封装性, 使用建造者模式可以使客户端不必知道产品内部组成的细节
  • 建造者独立,容易扩展
  • 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响
  • 可以实现参数可选的功能,使用Builder链式调用只传递部分参数

缺点

  • 会产生多余的Builder对象以及Director对象
  • 产品必须有共同点,范围有限制

Android 中的应用

  • AlertDialog 弹窗组件

参考

书籍:《设计模式之禅》、《Android源码设计模式》
技术文章:菜鸟教程-设计模式