Builder模式

161 阅读2分钟

摘要

Builder模式是一种创建型设计模式,它允许你创建复杂对象的过程与其表现分离。这种模式通常使用一个Builder接口来定义对象的构建步骤,并且可以允许不同的Builder实现对象的不同表现。

架构图

structure-2x.png

为什么要使用Builder模式?

在软件开发中,我们经常需要创建复杂的对象,这些对象可能包含多个部分或组件。如果我们尝试直接创建这些复杂对象,可能会导致代码变得混乱和难以维护。Builder模式提供了一种优雅而简洁的方式来创建复杂的对象,从而使代码更加模块化和易于维护。

Builder模式的核心思想是将对象的构建过程与其表现分离。这意味着我们可以使用同一个Builder接口来构建不同表现的对象,而无需在代码中硬编码这些表现。

如何使用Builder模式?

Builder模式通常由一个抽象的Builder接口、具体的Builder实现、一个Director和最终的产品组成。以下是Builder模式的一般工作流程:

  1. 创建一个抽象的Builder接口,该接口定义了构建对象所需的步骤。
  2. 创建具体的Builder实现,每个实现都可以根据需要构建不同表现的对象。
  3. 创建一个Director类,该类定义了创建对象的高级逻辑,并将这个逻辑委托给一个Builder实例。
  4. 创建最终的产品类,该类由Director和Builder实现共同构建。

代码示例

演示如何使用Builder模式来创建一个简单的汽车对象

// 抽象Builder接口
public interface CarBuilder { 
    public void setWheels(int value); 
    public void setEngine(String value); 
    public void setColor(String value); 
    public Car getCar(); 
}

// 具体Builder实现 
public class SportsCarBuilder implements CarBuilder { 
    private Car car;
    public SportsCarBuilder() { 
        this.car = new Car(); 
    } 
    
    @Override 
    public void setWheels(int value) {
        this.car.setWheels(value); 
    } 
    
    @Override 
    public void setEngine(String value) {
        this.car.setEngine(value); 
    } 
    
    @Override 
    public void setColor(String value) {
        this.car.setColor(value); 
    } 
    
    @Override 
    public Car getCar() {
        return this.car; 
    }
}

// Director类
public class CarDirector {
    private CarBuilder builder;
    
    public CarDirector(CarBuilder builder) {
        this.builder = builder;
    }

    public void constructCar() {
        this.builder.setWheels(4);
        this.builder.setEngine("V8");
        this.builder.setColor("Red");
    }
}

// 最终的产品类
public class Car {
    private int wheels; 
    private String engine; 
    private String color;
    
    public int getWheels() { 
        return wheels; 
    } 
    
    public void setWheels(int wheels) {
        this.wheels = wheels; 
    } 
    
    public String getEngine() {
        return engine; 
    } 
    
    public void setEngine(String engine) {
        this.engine = engine; 
    } 
    
    public String getColor() {
        return color; 
    } 
    
    public void setColor(String color) {
        this.color = color; 
    }
    
    @Override 
    public String toString() {
        return this.color + " car with " + this.engine + " engine and " + this.wheels + " wheels."; 
    }
}

// 使用Builder模式创建一个汽车对象
public class BuilderDemo {
    public static void main(String[] args) {
        CarBuilder builder = new SportsCarBuilder(); 
        CarDirector director = new CarDirector(builder); 
        director.constructCar(); 
        Car car = builder.getCar(); 
        System.out.println(car); 
    } 
}

上述代码定义了抽象的CarBuilder接口,具体的SportsCarBuilder实现,Director类CarDirector以及最终的产品类Car。在BuilderDemo类中,我们使用Builder模式创建一个SportsCarBuilder对象,通过CarDirector类构造汽车对象,并最终获取由Builder创建的Car对象,并输出该对象的信息。

参考资料: refactoring.guru/design-patt…