建造者模式(Builder Pattern)是一种创建型设计模式,用于将一个复杂对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。
核心思想
将复杂对象的创建步骤分解开来,通过一步步的构建来完成对象的创建,隐藏构建的具体细节,从而使构造过程更加灵活。
组成
-
Builder(抽象建造者)
定义用于创建产品各部分的接口。
-
ConcreteBuilder(具体建造者)
实现抽象建造者接口,完成产品的具体部分构造。
-
Product(产品类)
表示复杂对象,包含多个组成部分。
-
Director(指挥者)
调用建造者中的方法按特定顺序来构建产品。
优缺点
- 优点
分离复杂构建过程与表示:提高代码的清晰性和可维护性。
易于扩展:可以通过添加新的具体建造者来扩展创建流程。
细节控制:通过指挥者可以按特定步骤控制产品的创建顺序。 - 缺点
生成器类的数量可能会增加,增加代码复杂度。
不适用于构造过程过于简单的场景。
代码实现示例
假设要创建一辆汽车,每辆车由车轮、发动机、车身等部分组成。
java
// 产品类
public class Car {
private String engine;
private String wheels;
private String body;
// Getter 和 Setter
public void setEngine(String engine) {
this.engine = engine;
}
public void setWheels(String wheels) {
this.wheels = wheels;
}
public void setBody(String body) {
this.body = body;
}
@Override
public String toString() {
return "Car [engine=" + engine + ", wheels=" + wheels + ", body=" + body + "]";
}
}
// 抽象建造者
public interface CarBuilder {
void buildEngine();
void buildWheels();
void buildBody();
Car getCar(); // 返回建造好的产品
}
// 具体建造者
public class SportsCarBuilder implements CarBuilder {
private Car car;
public SportsCarBuilder() {
this.car = new Car();
}
@Override
public void buildEngine() {
car.setEngine("V8 Engine");
}
@Override
public void buildWheels() {
car.setWheels("Sports Wheels");
}
@Override
public void buildBody() {
car.setBody("Sleek Sports Body");
}
@Override
public Car getCar() {
return car;
}
}
// 指挥者
public class Director {
private CarBuilder builder;
public Director(CarBuilder builder) {
this.builder = builder;
}
public Car constructCar() {
builder.buildEngine();
builder.buildWheels();
builder.buildBody();
return builder.getCar();
}
}
//客户端测试
public class Main {
public static void main(String[] args) {
// 创建具体建造者
CarBuilder sportsCarBuilder = new SportsCarBuilder();
// 指挥者控制构建过程
Director director = new Director(sportsCarBuilder);
// 构建产品
Car sportsCar = director.constructCar();
// 输出结果
System.out.println(sportsCar);
}
}
建造者模式适用场景
- 复杂对象的创建:当一个对象的创建涉及多个部分且需要特定顺序时。
- 多种构造方式:需要为同一产品创建不同的表示。
- 隔离创建细节:需要隐藏产品的构建细节时。
- 如果你需要进一步探索建造者模式的高级用法或其他设计模式,随时告诉我!