创建型:建造者模式

发布于:2025-05-24 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 工作流程

2.3 实现案例

2.4 变体:链式建造者(常见于多参数对象,无需指挥者)

3、优缺点分析

4、适用场景


1、核心思想

目的:将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

           建造者的制造过程不仅要分步完成,还要按照顺序进行,所以建造者的各制造步骤与逻辑都应该被抽离出来独立于数据模型。

2、实现方式

2.1 模式结构

四个核心结构:

  • Product(产品)​:复杂的产品类,构建过程相对复杂,需要其他组件组装而成。
  • Builder(抽象建造者)​:建造者接口,定义了构成产品的各个组件的构建标准,通常有多个步骤。
  • ConcreteBuilder(具体建造者)​:具体的建造者实现类,可以有多种实现,负责产品的组装但不包含整体建造逻辑。
  • Director(指挥者)​:持有建造者接口引用的指导者类,指导建造者按一定的逻辑进行建造。

2.2 工作流程

  1. 客户端创建具体建造者实例,并传递给指挥者。

  2. 指挥者按预定步骤调用建造者的方法。

  3. 具体建造者逐步构建产品的各个部件。

  4. 最终由建造者返回组装完成的产品。

2.3 实现案例

假设构建一个House对象,步骤包括打地基、建墙、装屋顶和装修。不同房屋类型(如木屋、砖房)的建造细节不同,但流程一致。

每一个房屋的结构一致,施工方(具体建造者)不同,会导致最终的房屋产品类型不同。所以如果需要扩展建造的房屋类型,只需要扩展增加具体建造者的实现(比如砖房建造者等),符合开闭原则

// 1、产品类
class House {
    private String foundation;
    private String walls;
    private String roof;
    // 省略getter/setter
}

// 2、抽象建造者
interface HouseBuilder {
    void buildFoundation();
    void buildWalls();
    void buildRoof();
    House getResult();
}

// 3、具体建造者:木屋
class WoodHouseBuilder implements HouseBuilder {
    private House house = new House();
    public void buildFoundation() { house.setFoundation("Wood Foundation"); }
    public void buildWalls() { house.setWalls("Wood Walls"); }
    public void buildRoof() { house.setRoof("Wood Roof"); }
    public House getResult() { return house; }
}

// 4、指挥者
class ConstructionDirector {
    public House construct(HouseBuilder builder) {
        builder.buildFoundation();
        builder.buildWalls();
        builder.buildRoof();
        return builder.getResult();
    }
}

// 5、客户端使用
public class Client {
    public static void main(String[] args) {
        HouseBuilder builder = new WoodHouseBuilder();
        ConstructionDirector director = new ConstructionDirector();
        House house = director.construct(builder);
    }
}

2.4 变体:链式建造者(常见于多参数对象,无需指挥者)

// 产品类
class Person {
    private String name;
    private int age;
    // 其他属性...

    // 建造者作为静态内部类
    public static class Builder {
        private String name;
        private int age = 0; // 默认值

        public Builder(String name) { this.name = name; }
        public Builder age(int age) { this.age = age; return this; }
        public Person build() { return new Person(this); }
    }

    private Person(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }
}

// 客户端使用
Person person = new Person.Builder("Alice").age(30).build();

3、优缺点分析

优点:

  1. 分离构建与表示:客户端无需了解内部构造细节。

  2. 灵活扩展:通过新增建造者支持新产品类型。

  3. 精细控制:分步骤构建,便于管理复杂对象的创建过程。

缺点:

  1. 代码冗余:需编写多个建造者类,增加代码量。

  2. 适用范围有限:仅当对象构造复杂或存在多种表示时适用。

4、适用场景

  • 对象包含多个部件,且构建过程需相同步骤。

  • 构造过程需支持不同配置或表示(如生成不同格式文档)。

  • 需要创建的对象具有大量可选参数或复杂依赖。


网站公告

今日签到

点亮在社区的每一天
去签到