设计模式是在软件设计中常见问题的可重用解决方案。建造者模式是其中之一,它主要用于创建一系列复杂对象的构建过程,使得构建过程和最终的表示分离。
-
概述
建造者模式是一种对象创建型模式,它通过一步一步地构建复杂对象,使得同样的构建过程可以创建不同的表示。该模式的主要目的是将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 -
模式结构
建造者模式主要包含以下几个角色:
产品(Product):表示被构建的复杂对象。它包含多个部件,这些部件可以是基本类型或对象,也可以是其他复杂对象。
抽象建造者(Builder):声明了用于构建产品的抽象方法和接口。
具体建造者(ConcreteBuilder):实现了抽象建造者接口,负责构建产品的具体部件。
指导者(Director):负责构建使用建造者接口的对象,通常包含一个构建方法,通过调用建造者的方法按特定顺序构建产品。
- 实例场景
考虑一个汽车制造的例子,汽车由多个部件组成,例如引擎、车轮、座椅等。不同型号的汽车可能由相同的部件组成,但构建顺序和组合方式可能有所不同。
java
// 产品类
public class Car {
private String engine;
private String wheels;
private String seats;
// 省略构造方法和其他方法
// 省略getter和setter方法
}
java
// 抽象建造者接口
public interface CarBuilder {
void buildEngine();
void buildWheels();
void buildSeats();
Car getResult();
}
java
// 具体建造者实现
public class SportsCarBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("Sports Engine");
}
@Override
public void buildWheels() {
car.setWheels("Sports Wheels");
}
@Override
public void buildSeats() {
car.setSeats("Sports Seats");
}
@Override
public Car getResult() {
return car;
}
}
java
// 指导者
public class CarDirector {
public Car buildCar(CarBuilder builder) {
builder.buildEngine();
builder.buildWheels();
builder.buildSeats();
return builder.getResult();
}
}
4. 使用建造者模式
java
public class Client {
public static void main(String[] args) {
CarBuilder sportsCarBuilder = new SportsCarBuilder();
CarDirector carDirector = new CarDirector();
Car sportsCar = carDirector.buildCar(sportsCarBuilder);
System.out.println("Sports Car Engine: " + sportsCar.getEngine());
System.out.println("Sports Car Wheels: " + sportsCar.getWheels());
System.out.println("Sports Car Seats: " + sportsCar.getSeats());
}
}
- 优点与适用场景
5.1 优点
构建过程和最终表示分离:建造者模式将一个复杂对象的构建过程与其最终表示分离,使得构建过程可以独立于表示。
更好的控制构建过程:通过指导者控制构建过程,可以灵活地选择构建顺序或部件组合方式。
更好的复用性:可以通过相同的构建过程创建不同的表示,提高代码复用性。
5.2 适用场景
需要构建一个复杂对象,且构建过程与表示相对独立。
需要更好地控制构建过程。
构建的对象需要多个不同表示。
- 总结
建造者模式是一种创建型设计模式,适用于需要构建复杂对象的场景。它通过将构建过程与最终表示分离,提高了代码的灵活性和复用性。在实际应用中,建造者模式常用于创建复杂的对象,如图形界面中的复杂对话框、文档对象等。在使用建造者模式时,可以根据具体需求选择不同的具体建造者,以创建不同的表示。