GoF 23 种设计模式之一:建造者模式(Builder Pattern)

引言

在面向对象设计中,当一个类的构造函数参数过多、或者某些参数具有可选性时,直接使用构造函数或静态工厂方法会导致代码可读性和可维护性下降。建造者模式(Builder Pattern)正是为了解决这一问题而提出的创建型设计模式之一。它将对象的构造过程与表示分离,通过逐步构建(step-by-step)的方式,使得创建复杂对象更加清晰、灵活且安全。


一、什么是建造者模式?

建造者模式属于 GoF 提出的 23 种设计模式中的创建型模式。其核心思想是:

  1. 将复杂对象的构造过程封装在一个 Builder(建造者)类中

  2. 通过链式调用或分步调用,按需设置产品(Product)的各个属性

  3. 最后由 Builder 的 build() 方法统一完成对象的创建并返回。

这样做的好处在于,客户端无需关心对象的内部构造细节,只需要按照需求选择性地调用 Builder 的方法即可。


二、建造者模式的优点

  1. 简化构造过程

    避免大型构造函数的臃肿参数列表;

  2. 提高可读性与可维护性

    链式调用让代码更像“描述”,更具可读性;

  3. 增强灵活性

    可以在不同场景下有选择地设置必要属性,支持可选参数;

  4. 便于扩展

    当产品增加新属性时,只需在 Builder 中添加对应方法,无需修改客户端代码。


三、适用场景

  • 构造函数参数过多,且多数为可选参数;

  • 对象构造过程复杂,存在多个步骤且有严格顺序;

  • 希望在创建不同表示时复用构造流程;

  • 需要将“产品”的内部表示与生成过程解耦。


四、代码示例

以下示例展示了一个 Person 类,使用建造者模式创建 Person 实例。

package com.sangui.builderpattern;

/**
* Person 类 —— 使用建造者模式构造复杂对象
*/
public class Person {
   // 使用 final 强调不可变性
   private final String name;
   private final int age;

   // 私有化构造函数,外部只能通过 Builder 创建
   private Person(String name, int age) {
       this.name = name;
       this.age = age;
  }

   public String getName() {
       return name;
  }

   public int getAge() {
       return age;
  }

   // 公开静态方法,获取 Builder 实例
   public static PersonBuilder builder() {
       return new PersonBuilder();
  }

   @Override
   public String toString() {
       return "Person{name='" + name + "', age=" + age + "}";
  }

   /**
    * 静态内部类 —— PersonBuilder
    */
   public static class PersonBuilder {
       private String name;
       private int age;

       public PersonBuilder name(String name) {
           this.name = name;
           return this;
      }

       public PersonBuilder age(int age) {
           this.age = age;
           return this;
      }

       /**
        * 构建最终的 Person 对象
        */
       public Person build() {
           // 可在此处添加校验逻辑,例如:age >= 0
           if (age < 0) {
               throw new IllegalArgumentException("年龄不能为负数");
          }
           return new Person(name, age);
      }
  }
}
package com.sangui.test;

import com.sangui.builderpattern.Person;

/**
* 测试建造者模式的两种用法
*/
public class Test {
   public static void main(String[] args) {
       // 方式一:分步调用,适合插入调试或动态逻辑
       /*
       Person.PersonBuilder builder = Person.builder();
       builder.name("Tom");
       builder.age(30);
       Person person1 = builder.build();
       System.out.println(person1);
       */

       // 方式二:链式调用,代码简洁
       Person person2 = Person.builder()
              .name("Jack")
              .age(24)
              .build();
       System.out.println(person2);
  }
}

五、小结

  1. 建造者模式 通过分步、链式的方式创建对象,使构造过程更具可读性与可维护性;

  2. 适用于复杂对象可选参数多的场景;

  3. build() 方法中可集中校验或填充默认值,增强安全性;

  4. 与工厂模式不同,建造者模式更关注“怎样一步步构建出对象”,而工厂模式关注“根据条件选择哪一种产品”。

  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录