建造者模式(Builder Pattern)
是一种创建型设计模式,它允许使用多个简单的对象一步一步构建一个复杂的对象。建造者模式的主要目的是将对象的构造与它的表示分离,使得相同的构建过程可以创建不同的表示。
建造者模式的核心要素
- Builder:定义一个用于创建产品对象的接口。
- ConcreteBuilder:实现Builder接口,构建和装配各个部件。
- Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
- Director:构造一个使用Builder接口的对象。
建造者模式的结构图
+---------------+
| Director |
+---------------+
|
v
+---------------+
+-----------+ | Builder |<-----------+
| Client |<----------| +buildPartA() | |
+-----------+ | +buildPartB() | |
+---------------+ |
| |
v |
+-----------------+ |
| ConcreteBuilder | |
+-----------------+ |
| - product | |
+-----------------+ |
| |
v |
+-----------+ |
| Product |<-------------+
+-----------+
代码实现
产品类
// Product class
public class House {
private String foundation;
private String structure;
private String roof;
private String interior;
public void setFoundation(String foundation) {
this.foundation = foundation;
}
public void setStructure(String structure) {
this.structure = structure;
}
public void setRoof(String roof) {
this.roof = roof;
}
public void setInterior(String interior) {
this.interior = interior;
}
@Override
public String toString() {
return "House [foundation=" + foundation + ", structure=" + structure +
", roof=" + roof + ", interior=" + interior + "]";
}
}
建造者接口
// Builder interface
public interface HouseBuilder {
void buildFoundation();
void buildStructure();
void buildRoof();
void buildInterior();
House getHouse();
}
具体建造者类
// ConcreteBuilder class
public class ConcreteHouseBuilder implements HouseBuilder {
private House house;
public ConcreteHouseBuilder() {
this.house = new House();
}
@Override
public void buildFoundation() {
house.setFoundation("Concrete, brick, and stone");
System.out.println("ConcreteHouseBuilder: Foundation complete...");
}
@Override
public void buildStructure() {
house.setStructure("Wooden structure");
System.out.println("ConcreteHouseBuilder: Structure complete...");
}
@Override
public void buildRoof() {
house.setRoof("Concrete roof");
System.out.println("ConcreteHouseBuilder: Roof complete...");
}
@Override
public void buildInterior() {
house.setInterior("Paint and furniture");
System.out.println("ConcreteHouseBuilder: Interior complete...");
}
@Override
public House getHouse() {
return this.house;
}
}
指导者类
// Director class
public class ConstructionEngineer {
private HouseBuilder houseBuilder;
public ConstructionEngineer(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House constructHouse() {
this.houseBuilder.buildFoundation();
this.houseBuilder.buildStructure();
this.houseBuilder.buildRoof();
this.houseBuilder.buildInterior();
return this.houseBuilder.getHouse();
}
}
客户端代码
// Client code
public class Client {
public static void main(String[] args) {
HouseBuilder houseBuilder = new ConcreteHouseBuilder();
ConstructionEngineer engineer = new ConstructionEngineer(houseBuilder);
House house = engineer.constructHouse();
System.out.println("House constructed: " + house);
}
}