建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。这种模式将对象的构造与表示分离,使得相同的构造过程可以产生不同的表示。建造者模式适用于创建对象需要多个步骤,并且这些步骤的顺序可能不同的情况。
主要角色
- 产品(Product):需要构建的复杂对象。
- 建造者(Builder):一个接口,定义了构建产品各个部件的方法。
- 具体建造者(Concrete Builder):实现建造者接口,定义并明确它们构建的产品部件。
- 导演(Director):构建一个使用建造者接口的对象,指导构建过程。
- 客户端(Client):创建导演对象,并使用它来构建所需的产品对象。
优缺点
优点
- 封装性好:客户端不需要知道产品内部组成的细节。
- 扩展性好:可以很容易地增加新的具体建造者。
- 便于控制细节风险:由于建造者是独立的,因此改变一个建造者对其他建造者没有影响。
缺点
- 产品必须有共同点:如果产品之间没有共同点,则不适合使用建造者模式。
- 内部结构复杂:如果产品的内部结构过于复杂,可能会导致系统中类的数量增加。
实例
假设我们要构建一个房屋,房屋有不同的部分,如地基、墙壁、屋顶等。我们可以使用建造者模式来构建这个房屋。
java
// 产品
class House {
private String foundation;
private String walls;
private String roof;
public void setFoundation(String foundation) {
this.foundation = foundation;
}
public void setWalls(String walls) {
this.walls = walls;
}
public void setRoof(String roof) {
this.roof = roof;
}
}
// 建造者接口
interface HouseBuilder {
void buildFoundation();
void buildWalls();
void buildRoof();
House getHouse();
}
// 具体建造者
class ConcreteHouseBuilder implements HouseBuilder {
private House house;
public ConcreteHouseBuilder() {
house = new House();
}
public void buildFoundation() {
house.setFoundation("混凝土基础");
}
public void buildWalls() {
house.setWalls("砖墙");
}
public void buildRoof() {
house.setRoof("瓦屋顶");
}
public House getHouse() {
return house;
}
}
// 导演
class HouseDirector {
private HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public void constructHouse() {
houseBuilder.buildFoundation();
houseBuilder.buildWalls();
houseBuilder.buildRoof();
}
public House getHouse() {
return houseBuilder.getHouse();
}
}
// 客户端
public class BuilderPatternDemo {
public static void main(String[] args) {
HouseBuilder houseBuilder = new ConcreteHouseBuilder();
HouseDirector houseDirector = new HouseDirector(houseBuilder);
houseDirector.constructHouse();
House house = houseDirector.getHouse();
System.out.println("房屋建造完成:" + house.toString());
}
}
在这个例子中,我们定义了一个房屋类(House),一个建造者接口(HouseBuilder),一个具体建造者类(ConcreteHouseBuilder),一个导演类(HouseDirector)以及一个客户端类(BuilderPatternDemo)。客户端通过导演类和具体建造者类来构建房屋对象。