开场白

构建与表现分离。把一个复杂对象的构建与其表现分离。不同的构建产生不同的表现,例如:Dialog构建不同产生不同表现,有的需要标题,有的不需要标题只有内容,有的需要确定按钮,有的不需要取消按钮等。

使用场景

  • 初始化一个复杂对象,需要配置很多参数。
  • 不同的构建,需要产生不同的表现。

优点

  • 良好的封装性,使用Builder模式客户端不需要知道产品内部组成细节
  • 建造者独立,易于拓展

    缺点

  • 产生多余Builder对象及Director对象,消耗内存

    UML

    Builder模式-基础 - 图1

  • Computer:抽象类

  • Builder:抽象Builder类,规范产品的组建,一般由子类实现具体组件过程
  • MacBookProBuilder:具体Builder类
  • Director:统一组装过程

通常在使用Builder过程中,Director角色被忽略,从而仅仅通过Builder构建链式调用

Coding

  1. public abstract class Computer {
  2. protected String mBoard;
  3. protected String mDisplay;
  4. protected String mOS;
  5. protected Computer () {}
  6. public void setBoard(String board) {
  7. mBoard = board;
  8. }
  9. public void setDisplay(String display) {
  10. mDisplay = display;
  11. }
  12. public abstract void setOS();
  13. public String toString() {
  14. return "Computer [mBoard= " + mBoard + ", mDisplay= " + mDisplay + ", mOS= " + mOS + "]";
  15. }
  16. }
  1. public class MacBookPro extends Computer {
  2. protected MacBookPro() {}
  3. @Override
  4. public void setOS() {
  5. mOS = "MAC OS X 12.3.1";
  6. }
  7. }
  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. }
  1. public class MacBookBuilder extends Builder {
  2. private Computer mComputer = new MacBookPro();
  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. }
  1. public class Director {
  2. Builder mBuilder = null;
  3. public Director(Builder builder) {
  4. mBuilder = builder;
  5. }
  6. public void constructor(String board,String display) {
  7. mBuilder.buildBoard(board);
  8. mBuilder.buildDisplay(display);
  9. mBuilder.buildOS();
  10. }
  11. }
  1. public class Test {
  2. public static void main() {
  3. Builder builder = new MacBookProBuilder();
  4. Director director = new Direcotr(builder);
  5. director.construct("华硕主板","三星显示器");
  6. System.out.println("Computer info: " + builder.create().toString());
  7. }
  8. }