- 概述 建造者模式是一种创建型设计模式,它允许你分步骤构建复杂的对象。这种模式在对象的构造过程中使用一个单独的“建造者”对象,通过一系列的方法调用来逐步完成对象的构建。与工厂模式不同的是,建造者模式关注的是如何一步步地构建复杂对象,而不仅仅是简单地创建一个实例。
- 适用场景 当一个对象的构建过程非常复杂,涉及多个参数,部分参数可能有默认值。 对象内部表示需要被隐藏,用户只能通过接口访问。 需要对构建过程进行精细控制。
- 结构 建造者模式主要包含以下几个角色: Product (产品角色): 这是建造者的最终结果,即被构建的对象。 Builder (抽象建造者): 定义了创建产品各个部件的抽象方法。 ConcreteBuilder (具体建造者): 实现了Builder接口,负责构建和装配各个部件。 Director (指挥者): 构建一个使用Builder接口的对象。它知道如何以及何时调用具体建造者的各个方法。 Client (客户端): 创建Director对象并配置其所需的Builder对象,然后指导Director开始构建过程。
- 示例代码 4.1 产品类 - Product
public class House {
private String foundation;
private String walls;
private String roof;
// Getters and Setters
public String getFoundation() { return foundation; }
public void setFoundation(String foundation) { this.foundation = foundation; }
public String getWalls() { return walls; }
public void setWalls(String walls) { this.walls = walls; }
public String getRoof() { return roof; }
public void setRoof(String roof) { this.roof = roof; }
}
4.2 抽象建造者 - Builder
public interface HouseBuilder {
void buildFoundation();
void buildWalls();
void buildRoof();
House getHouse();
}
4.3 具体建造者 - ConcreteBuilder
public class StoneHouseBuilder implements HouseBuilder {
private House house;
public StoneHouseBuilder() {
this.house = new House();
}
@Override
public void buildFoundation() {
house.setFoundation("Stone Foundation");
}
@Override
public void buildWalls() {
house.setWalls("Stone Walls");
}
@Override
public void buildRoof() {
house.setRoof("Stone Roof");
}
@Override
public House getHouse() {
return house;
}
}
4.4 指挥者 - Director
public class ConstructionManager {
private HouseBuilder builder;
public ConstructionManager(HouseBuilder builder) {
this.builder = builder;
}
public House constructHouse() {
builder.buildFoundation();
builder.buildWalls();
builder.buildRoof();
return builder.getHouse();
}
}
4.5 客户端 - Client
public class Client {
public static void main(String[] args) {
HouseBuilder builder = new StoneHouseBuilder();
ConstructionManager manager = new ConstructionManager(builder);
House house = manager.constructHouse();
System.out.println(house.getFoundation());
System.out.println(house.getWalls());
System.out.println(house.getRoof());
}
}
- 总结 建造者模式使得我们可以更灵活地处理复杂对象的创建过程。通过将构建逻辑封装到具体的建造者类中,我们可以在不改变构建算法的情况下轻松地扩展或修改产品的内部表示。此外,由于构建过程被分解为多个步骤,因此可以更容易地管理依赖关系和顺序问题。