生成器模式
生成器模式(建造者模式、Builder模式)属于创建型模式的一种。
使用生成器模式,一般来说,是因为创建对象步骤较多,每个步骤都需要一个零部件,最终组合成一个完整的对象。尤其适合用于创建那些参数多、构建步骤复杂的对象。
生成器模式可以使用相同的创建代码生成不同类型和形式的对象。
我们使用Lombok在实体类上打的@Builder注解,就是使用的生成器模式。JavaMail的MimeMessage也可以看做一个生成器模式。
我们可以简化生成器模式,以链式调用的方式来创建对象。生成器模式在创建过程中可以灵活调用不同的步骤或组件。
生成器模式通常有以下角色:
- 产品:要创建的复杂对象。
- 生成器:用于创建产品的各个部分。通常包含多个方法,每个方法负责设置产品的某个部分。
- 具体生成器:负责具体构建产品的每个部分。
- 指挥者(主管类):负责管理构建过程,调用生成器方法构建出最终的产品。主管类并不是必需,使用主管类完全隐藏了产品构造细节,更简洁。
使用生成器模式来构建 House 对象。
1、产品类
// 产品类
class House {
private String wall;
private String roof;
private String door;
public void setWall(String wall) {
this.wall = wall;
}
public void setRoof(String roof) {
this.roof = roof;
}
public void setDoor(String door) {
this.door = door;
}
@Override
public String toString() {
return "House [wall=" + wall + ", roof=" + roof + ", door=" + door + "]";
}
}
2、生成器接口
// 生成器接口
interface HouseBuilder {
void buildWall();
void buildRoof();
void buildDoor();
House getHouse();
}
3、具体生成器
// 具体生成器
class ConcreteHouseBuilder implements HouseBuilder {
private House house;
public ConcreteHouseBuilder() {
house = new House();
}
@Override
public void buildWall() {
house.setWall("Brick Wall");
}
@Override
public void buildRoof() {
house.setRoof("Tile Roof");
}
@Override
public void buildDoor() {
house.setDoor("Wooden Door");
}
@Override
public House getHouse() {
return house;
}
}
4、指挥者(主管类)
// 指挥者(主管类)
class HouseDirector {
private HouseBuilder builder;
public HouseDirector(HouseBuilder builder) {
this.builder = builder;
}
public House constructHouse() {
builder.buildWall();
builder.buildRoof();
builder.buildDoor();
return builder.getHouse();
}
}
5、客户端
// 客户端
public class Main {
public static void main(String[] args) {
HouseBuilder builder = new ConcreteHouseBuilder();
HouseDirector director = new HouseDirector(builder);
House house = director.constructHouse();
System.out.println(house);
}
}
生成器模式的优缺点。
优点:
- 分离复杂构建逻辑:将复杂对象的构建过程与其表示分离,分步创建生成,使得构建逻辑更加清晰。
- 易于扩展:添加新的构建步骤只需增加新的生成器,便于扩展。
- 可读性强:代码结构清晰,易于理解,符合面向对象的设计原则。
- 生成不同形式的产品时,可以复用相同的制造代码。
缺点:
- 需要新增多个类, 因此代码整体复杂程度会有所增加。
- 若产品间差异很大,则不适合使用该模式。
使用生成器模式可避免 重叠构造函数(构造函数参数有多个,且部分参数具有默认值),可创建不同形式的的产品,可构造复杂对象。
生成器模式将复杂对象的构建过程封装在生成器内部,使得客户端代码更简洁、清晰。当产品较为复杂且需要详细配置时,使用生成器模式才更有意义。
生命特征是个反熵增的过程,没有疼和难,也没有人。-- 烟沙九洲