建造者模式(Builder)
一、问题
在某些情况下,一个对象的创建过程非常复杂,涉及多个步骤,每个步骤都可能有不同的实现方式。如果将所有创建逻辑放在一个类中,会导致该类变得庞大且难以维护。此外,如果需要创建不同的变体对象,就需要在该类中添加更多的逻辑,使得代码变得混乱。
二、解决方案
建造者模式提供了一种将一个复杂对象的构建过程与其表示分离的方法。它将对象的构建过程封装在一个独立的"建造者"类中,由该类负责逐步构建对象。这样,可以根据需要创建不同的建造者来构建不同的对象变体。通常,建造者模式涉及以下角色:
- 产品(Product):表示正在构建的复杂对象。建造者模式的目标是构建这个产品。
- 抽象建造者(Abstract Builder):定义了构建产品的步骤和方法,但没有具体的实现。不同的具体建造者可以实现不同的构建步骤,从而创建不同的产品变体。
- 具体建造者(Concrete Builder):实现了抽象建造者定义的方法,完成了产品的构建过程。每个具体建造者负责构建特定的产品变体。
- 指导者(Director):负责控制建造的过程。它通过将客户端与具体建造者分离,确保产品的构建是按照一定顺序和规则进行的。
三、效果
建造者模式的效果包括:
- 分离构建过程和表示:通过建造者模式,可以将复杂对象的构建过程与其最终表示分离,使得构建过程更加清晰可控。
- 支持不同的表示:通过使用不同的具体建造者,可以创建不同的产品表示,而不改变客户端的代码。
- 更好的可扩展性:如果需要添加新的产品变体,只需创建一个新的具体建造者即可,而无需修改已有的代码。
- 隐藏产品的内部结构:客户端只需与抽象建造者和指导者交互,无需关心产品的内部构建细节。
总之,建造者模式适用于需要构建复杂对象,且构建过程涉及多个步骤或变体的情况。通过将构建过程分解为可重用的步骤,建造者模式提供了一种结构化的方法来创建对象。
一个简单的例子,设想你正在建造一个汽车,汽车需要引擎,轮胎,座椅等等组成部分,这些部分的制作过程和步骤都是固定的,但是每一个部分在具体的表现上可能有所不同。使用建造者模式,你可以创建一个"汽车"的指挥者,把"建造引擎",“建造轮胎”,"建造座椅"等等任务交给不同的建造者去完成,最后由指挥者来拼装得到汽车。
四、代码
1.Car.java
/**
* Car
*
* @author 裴浩宇
* @version 1.0
* @date 2023/10/27 14:20
* @description 产品类——车
*/
public class Car {
// 发动机
private String engine;
// 轮胎
private String tire;
// 座位
private String seat;
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getTire() {
return tire;
}
public void setTire(String tire) {
this.tire = tire;
}
public String getSeat() {
return seat;
}
public void setSeat(String seat) {
this.seat = seat;
}
@Override
public String toString() {
return "Car{" +
"engine='" + engine + '\'' +
", tire='" + tire + '\'' +
", seat='" + seat + '\'' +
'}';
}
}
java
2.Builder.java
/**
* Builder
*
* @author 裴浩宇
* @version 1.0
* @date 2023/10/27 14:23
* @description 建造者
*/
public abstract class Builder {
// 车
protected Car car = new Car();
/**
* 组装发动机
*/
public abstract void setEngine();
/**
* 组装轮胎
*/
public abstract void setTire();
/**
* 组装座位
*/
public abstract void setSeat();
/**
* 输出车
* @return 车
*/
public Car outputCar() {
return car;
}
}
java
3.BYDBuilder.java
/**
* BYDBuilder
*
* @author 裴浩宇
* @version 1.0
* @date 2023/10/27 15:15
* @description BYD汽车建造类
*/
public class BYDBuilder extends Builder {
@Override
public void setEngine() {
System.out.println("开始组装比亚迪发动机");
car.setEngine("比亚迪发动机");
System.out.println("比亚迪发动机组装完成");
}
@Override
public void setTire() {
System.out.println("开始组装比亚迪轮胎");
car.setTire("比亚迪轮胎");
System.out.println("比亚迪轮胎组装完成");
}
@Override
public void setSeat() {
System.out.println("开始组装比亚迪座位");
car.setSeat("比亚迪座位");
System.out.println("比亚迪座位组装完成");
}
}
java
4.OSHANBuilder.java
/**
* OSHANBuilder
*
* @author 裴浩宇
* @version 1.0
* @date 2023/10/29 9:24
* @description 欧尚汽车建造类
*/
public class OSHANBuilder extends Builder {
@Override
public void setEngine() {
System.out.println("开始组装欧尚发动机");
car.setEngine("欧尚发动机");
System.out.println("欧尚发动机组装完成");
}
@Override
public void setTire() {
System.out.println("开始组装欧尚轮胎");
car.setTire("欧尚轮胎");
System.out.println("欧尚轮胎组装完成");
}
@Override
public void setSeat() {
System.out.println("开始组装欧尚座位");
car.setSeat("欧尚座位");
System.out.println("欧尚座位组装完成");
}
}
java
5.Director.java
/**
* Director
*
* @author 裴浩宇
* @version 1.0
* @date 2023/10/29 9:29
* @description 指导者类
*/
public class Director {
// 建造者
private final Builder builder;
/**
* 构造方法
* @param builder 建造者
*/
public Director(Builder builder) {
this.builder = builder;
}
/**
* 开始造车
* @return 车
*/
public Car buildCar() {
builder.setEngine();
builder.setTire();
builder.setSeat();
return builder.outputCar();
}
}
java
6.Main.java
/**
* Main
*
* @author 裴浩宇
* @version 1.0
* @date 2023/10/29 9:33
* @description 客户端
*/
public class Main {
public static void main(String[] args) {
// 初始化比亚迪汽车指导类
Director BYDDirector = new Director(new BYDBuilder());
// 开始制造比亚迪汽车
Car BYDcar = BYDDirector.buildCar();
System.out.println(BYDcar.toString());
// 初始化欧尚汽车指导类
Director OSHANDirector = new Director(new OSHANBuilder());
// 开始制造欧尚汽车
Car OSHANCar = OSHANDirector.buildCar();
System.out.println(OSHANCar.toString());
}
}
java