建造者模式:组装复杂实例

发布时间 2023-04-23 15:07:48作者: 穆海如枫

建造者模式的生命周期通常包括以下步骤:

  1. 创建一个建造者对象
  2. 调用该创建者对象的一系列设置方法,以指定对象的各个属性
  3. 调用build()方法,该方法将运行实际的构建过程
  4. 返回构建的对象

建造者模式可以减少代码的重复性,并且可以简化创建复杂对象的过程,从而提高代码的可读性和可维护性。由于它提供了灵活的构造选项,因此建造者模式尤其适用于创建具有多个可选属性的对象。

建造者模式通常涉及四个主要组件:产品(Product),建造者(Builder),指挥者(Director)和客户端(Client)。

  1. 产品 是我们要构建的对象,它具有一系列属性和方法。
  2. 建造者 是一个具有构建产品各个组成部分的接口或抽象类。它定义了构建对象所需的方法,并且可以有多种实现。
  3. 指挥者 是负责协调建造者的对象。它负责确保构造器按正确的顺序调用,最终构建出目标对象,同时它可能也包含一些逻辑,比如提供默认值和默认构造器等。
  4. 客户端 是调用指挥者构建对象的代码。它只需要实例化指挥者和相应的建造者,并将建造器传递给指挥者即可。

示例代码:

// 产品类
class Product {
   private String partA;
   private String partB;
   private String partC;
   
   public void setPartA(String partA) {
      this.partA = partA;
   }
   
   public void setPartB(String partB) {
      this.partB = partB;
   }
   
   public void setPartC(String partC) {
      this.partC = partC;
   }
   
   public String getPartA() {
      return partA;
   }
   
   public String getPartB() {
      return partB;
   }
   
   public String getPartC() {
      return partC;
   }
}

// 建造者接口
interface Builder {
   public void buildPartA();
   public void buildPartB();
   public void buildPartC();
   public Product getProduct();
}

// 具体建造者类
class ConcreteBuilder implements Builder {
   private Product product = new Product();
   
   public void buildPartA() {
      product.setPartA("PartA");
   }
   
   public void buildPartB() {
      product.setPartB("PartB");
   }
   
   public void buildPartC() {
      product.setPartC("PartC");
   }
   
   public Product getProduct() {
      return product;
   }
}

// 指挥者类
class Director {
   private Builder builder;
   
   public Director(Builder builder) {
      this.builder = builder;
   }
   
   public void construct() {
      builder.buildPartA();
      builder.buildPartB();
      builder.buildPartC();
   }
}

// 客户端代码
public class Client {
   public static void main(String[] args) {
      Builder builder = new ConcreteBuilder();
      Director director = new Director(builder);
      director.construct();
      Product product = builder.getProduct();
      System.out.println(product.getPartA());
      System.out.println(product.getPartB());
      System.out.println(product.getPartC());
   }
}