生成器模式

生成器模式(建造者模式、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);
    }
}

生成器模式的优缺点

优点:

  • 分离复杂构建逻辑:将复杂对象的构建过程与其表示分离,分步创建生成,使得构建逻辑更加清晰。
  • 易于扩展:添加新的构建步骤只需增加新的生成器,便于扩展。
  • 可读性强:代码结构清晰,易于理解,符合面向对象的设计原则。
  • 生成不同形式的产品时,可以复用相同的制造代码。

缺点:

  • 需要新增多个类, 因此代码整体复杂程度会有所增加。
  • 若产品间差异很大,则不适合使用该模式。

使用生成器模式可避免 重叠构造函数(构造函数参数有多个,且部分参数具有默认值),可创建不同形式的的产品,可构造复杂对象。

生成器模式将复杂对象的构建过程封装在生成器内部,使得客户端代码更简洁、清晰。当产品较为复杂且需要详细配置时,使用生成器模式才更有意义。

生命特征是个反熵增的过程,没有疼和难,也没有人。-- 烟沙九洲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值