当前位置: 首页 > article >正文

重学设计模式-建造者模式

本文介绍一下建造者模式,相对于工厂模式来说,建造者模式更为简单,且用的更少

定义

建造者模式是一种创建型设计模式,它使用多个简单的对象一步一步构建成一个复杂的对象。这种模式的主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

使用场景

  1. 当创建复杂对象的过程独立于它们的组成部分以及它们的装配顺序时:可以使用建造者模式来逐步构建复杂对象。
  2. 当构造过程必须允许被不同创建出来:例如,一个文本文档可能需要根据不同的格式(如HTML、纯文本等)来创建。
  3. 当类具有强制的分阶段创建过程时:例如,某些产品可能需要先安装基础部分,然后再添加可选的额外功能。

建造者模式主要有四个主体:

  • 抽象建造者 Builder:相当于建筑蓝图,声明了创建 Product 对象的各个部件指定的抽象接口。
  • 具体建造者 ConcreteBuilder:实现Builder抽象接口,构建和装配各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
  • 指挥者 Director:构建一个使用 Builder 接口的对象。主要有两个作用,一是隔离用户与对象的生产过程,二是负责控制产品对象的生产过程。
  • 产品角色 Product:被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

代码示例:

// 定义产品类
class House {
    private List<String> parts = new ArrayList<>();

    public void addPart(String part) {
        parts.add(part);
    }

    public void show() {
        for (String part : parts) {
            System.out.print(part + " ");
        }
        System.out.println();
    }
}

// 定义抽象建造者
abstract class HouseBuilder {
    protected House house;

    public abstract void buildBase();
    public abstract void buildWalls();
    public abstract void buildRoof();
    public abstract void buildWindows();
    public abstract House getResult();
}

// 具体建造者A
class ConcreteHouseBuilderA extends HouseBuilder {
    public ConcreteHouseBuilderA() {
        this.house = new House();
    }

    @Override
    public void buildBase() {
        house.addPart("Base");
    }

    @Override
    public void buildWalls() {
        house.addPart("Walls");
    }

    @Override
    public void buildRoof() {
        house.addPart("Roof");
    }

    @Override
    public void buildWindows() {
        house.addPart("Windows");
    }

    @Override
    public House getResult() {
        return house;
    }
}

// 具体建造者B
class ConcreteHouseBuilderB extends HouseBuilder {
    public ConcreteHouseBuilderB() {
        this.house = new House();
    }

    @Override
    public void buildBase() {
        house.addPart("Foundation");
    }

    @Override
    public void buildWalls() {
        house.addPart("Side walls");
    }

    @Override
    public void buildRoof() {
        house.addPart("Flat roof");
    }

    @Override
    public void buildWindows() {
        house.addPart("Large windows");
    }

    @Override
    public House getResult() {
        return house;
    }
}

// 指挥者
class Director {
    public House construct(HouseBuilder builder) {
        builder.buildBase();
        builder.buildWalls();
        builder.buildRoof();
        builder.buildWindows();
        return builder.getResult();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Director director = new Director();
        
        // 使用ConcreteHouseBuilderA构建房子
        HouseBuilder builderA = new ConcreteHouseBuilderA();
        House houseA = director.construct(builderA);
        System.out.println("House A:");
        houseA.show();
        
        // 使用ConcreteHouseBuilderB构建房子
        HouseBuilder builderB = new ConcreteHouseBuilderB();
        House houseB = director.construct(builderB);
        System.out.println("House B:");
        houseB.show();
    }
}
 

在上面的代码中,我们首先定义了一个House类,它有一个方法add_part用于添加房子的各个部分,还有一个方法show用于显示房子的所有部分。然后,我们定义了一个抽象的HouseBuilder类,它声明了四个方法(build_base, build_walls, build_roof, build_windows)和一个get_result方法。接下来,我们实现了两个具体的建造者类ConcreteHouseBuilderAConcreteHouseBuilderB,它们分别按照不同的方式构建房子。最后,我们定义了一个Director类,它负责指挥建造者按照一定的步骤构建房子。在客户端代码中,我们创建了两个不同的建造者,并使用同一个导演来构建两种不同类型的房子。


http://www.kler.cn/a/419857.html

相关文章:

  • CSS 动画效果实现:图片展示与交互
  • DICOM MPPS详细介绍
  • 第31天:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测
  • Centos7安装MySQL8.0详细教程(压缩包安装方式)
  • 【docker】Overlay网络
  • Linux 各个目录作用
  • 题海拾贝——生成元(Digit Generator,ACM/ICPC SEOUL 2005,UVa1583)
  • 15.三数之和 python
  • 深度学习模型:门控循环单元(GRU)详解
  • Web基础
  • java中的运算符
  • Elasticsearch面试内容整理-面试注意事项
  • Python 深度学习框架之Keras库详解
  • AI在线免费视频工具4:AI视频编辑ai-video-composer
  • 2024.12.2工作复盘
  • Ubuntu20.04安装NVIDIA显卡驱动
  • parallelStream并行流使用踩坑,集合安全
  • 4399 Android面试题及参考答案
  • [382]基于springboot的辽B代驾管理系统
  • 论文阅读:Deep divergence-based approach to clustering
  • 【HarmonyOS】自定义相机拍照和录像 (二)之录像
  • iptables 用于设置、维护和检查 IP 数据包的过滤规则。其基本用法是通过命令行界面配置流量的过滤策略,分为以下几类规则链:INPUT(入站流量)、OU
  • WINDOWS 单链表SLIST_ENTRY使用
  • Leecode刷题C语言之N皇后②
  • gitlab自动打包python项目
  • 【vue】响应式(object.defineProperty)、可配置的参数、vue渲染机制