第一篇 生成及初始化对象 第四章 - 建造者模式

  刚生成的对象通常还需要经过初始化才能正常工作。对象封装的信息越多,它的初始化过程也越繁琐。
  小令《天净沙・秋思》意象丰富,我们以此为例考察对象的初始化过程。

// 秋思
public class QiuSi {

  private String a, b, c, x, y, z;

  /* Getters and Setters */

}

// 测试类
public class Test {

  public void test() {
    // 生成对象
    QiuSi obj = new QiuSi();
    // 初始化
    obj.setA("枯藤");
    obj.setB("老树");
    obj.setC("昏鸦");
    obj.setX("小桥");
    obj.setY("流水");
    obj.setZ("人家");
  }

}

  初始化对象时调用了大量的Setter方法,看上去缺少章法。
  怎么优化一下代码呢?来看看建造者模式提供的设计思路。

// 秋思
public class QiuSi {

  private String a, b, c, x, y, z;

  // 建造方法(1)
  public QiuSi first(String a, String b, String c) {
    this.a = a;
    this.b = b;
    this.c = c;
    return this;
  }

  // 建造方法(2)
  public QiuSi second(String x, String y, String z) {
    this.x = x;
    this.y = y;
    this.z = z;
    return this;
  }

  /* Getters and Setters */

}

  这里有两个设计要点:
  (1)将赋值语句分组封装在若干建造方法里,使对象的初始化过程变得井然有序。
  (2)每个建造方法都返回对象本身(this),使得它们可以被链式调用,形如 obj.m1().m2().m3()。
  优化效果如下。

// 测试类
public class Test {

  public void test() {
    // 生成对象
    QiuSi obj = new QiuSi();
    // 初始化(链式调用)
    obj.first("枯藤", "老树", "昏鸦")
      .second("小桥", "流水", "人家");
  }

}
posted on 2025-03-23 13:04  星辰河岳  阅读(43)  评论(0)    收藏  举报