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

news2024/12/26 19:00:15

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

定义

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

使用场景

  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.coloradmin.cn/o/2252966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复现SMPLify-X: Ubuntu22.04, Cuda-11.3, GPU=3090Ti

Env: 3090Ti CUDA 最低支持版本需要>cuda-11.1 Ubuntu 22.04 Installation: Installing CUDA11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sudo sh cuda_11.3.0_465.19.01_linux.run …

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年&#xff0c;OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是&#xff0c;在AI驱动的…

JAVA |日常开发中读写XML详解

JAVA &#xff5c;日常开发中读写XML详解 前言一、XML 简介二、在 Java 中读取 XML2.1 使用 DOM&#xff08;Document Object Model&#xff09;方式读取 XML2.2 使用 SAX&#xff08;Simple API for XML&#xff09;方式读取 XML 三、在 Java 中写入 XML3.1 使用 DOM 方式写入…

GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集

2024-11-29 ,由穆罕默德本扎耶德人工智能大学等机构创建了GEOBench-VLM数据集&#xff0c;目的评估视觉-语言模型&#xff08;VLM&#xff09;在地理空间任务中的表现。该数据集的推出填补了现有基准测试在地理空间应用中的空白&#xff0c;提供了超过10,000个经过人工验证的指…

南昌榉之乡托养机构解读:自闭症与看电视并无必然联系

在探讨自闭症的成因时&#xff0c;有人会问&#xff1a;自闭症是多看电视引起的吗&#xff1f;今天&#xff0c;就让我们来看看南昌榉之乡托养机构对此有何见解。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校&#xff0c;一直致力于为大龄自闭症患者提供专业的支持…

LabVIEW MathScript工具包对运行速度的影响及优化方法

LabVIEW 的 MathScript 工具包 在运行时可能会影响程序的运行速度&#xff0c;主要是由于以下几个原因&#xff1a; 1. 解释型语言执行方式 MathScript 使用的是类似于 MATLAB 的解释型语言&#xff0c;这意味着它不像编译型语言&#xff08;如 C、C 或 LabVIEW 本身的 VI&…

基于eFramework车控车设中间件介绍

车设的发展&#xff0c;起源于汽车工业萌芽之初&#xff0c;经历了机械式操作的原始粗犷&#xff0c;到电子式调控技术的巨大飞跃&#xff0c;到如今智能化座舱普及&#xff0c;远程车控已然成为汽车标配&#xff0c;车设功能选项也呈现出爆发式增长&#xff0c;渐趋多元繁杂。…

使用 AWR 进行 Exadata 性能诊断 - 2018版

本文和之前的使用 AWR 进行 Exadata 性能诊断是非常类似的&#xff0c;理论部分几乎一样&#xff0c;但案例部分是不同的&#xff0c;其价值也在于此。前文是基于Exadata X10&#xff0c;本文是基于Exadata X5。当然&#xff0c;型号并不重要&#xff0c;重要的是分析过程。 本…

【AI系统】计算与调度

计算与调度 上一篇文章我们了解了什么是算子&#xff0c;神经网络模型中由大量的算子来组成&#xff0c;但是算子之间是如何执行的&#xff1f;组成算子的算法逻辑跟具体的硬件指令代码之间的调度是如何配合&#xff1f;这些内容将会在本文进行深入介绍。 计算与调度 计算与…

JavaSE学习心得(APL与算法篇)

常用APL和常见算法 前言 常用APL Math System Runtime Object ​编辑浅克隆 深克隆 Objects Biginteger 构造方法 成员方法 底层存储方式 Bigdecimal 构造方法 Bigdecimal的使用 底层存储方式 ​编辑正则表达式 两个判断练习 两个爬取练习 贪婪爬取和非贪…

C++ ——— 引用的概念以及特性

目录 引用的概念 引用在实际代码中的作用 引用的特性 1. 引用在定义时必须初始化 2. 一个变量可以有多个引用 3. 可以给别名再次取别名&#xff0c;或者多次取别名 4. 引用一旦引用了实体&#xff0c;就不能再引用其他实体了 引用的概念 引用不是新定义一个变量&#x…

Linux-异步IO和存储映射IO

异步IO 在 I/O 多路复用中&#xff0c;进程通过系统调用 select()或 poll()来主动查询文件描述符上是否可以执行 I/O 操作。而在异步 I/O 中&#xff0c;当文件描述符上可以执行 I/O 操作时&#xff0c;进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务…

嵌入式入门Day23

数据结构Day4 操作受限的线性表栈基本概念顺序栈顺序栈结构创建顺序栈判空和判满栈扩容入栈出栈遍历销毁栈 链式栈队列基本概念顺序队列循环顺序队列定义循环队列的创建循环顺序队列的判空和判满循环顺序队列的入队循环顺序队列的遍历循环顺序队列的出队循环顺序队列的销毁 链式…

C语言实验 一维数组

时间:2024.12.3 一、实验 7-1 交换最小值和最大值 #include<stdio.h> int main() {int n, a[10], i, min = 0, max = 0;scanf("%d", &n);for (i = 0; i < n; i++){scanf("%d",&a[i]);}for (i = 0; i < n; i++){if (a[min] > a[i…

聚合支付系统官方个人免签系统三方支付系统稳定安全高并发

系统采用fastadmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一-些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置对接! 注意&#xff1a;系统没有配置文档很使用教程&#xff0c;不清楚…

HTMLCSS 奇幻森林:小熊的甜蜜蛋糕派对大冒险

这个 HTML 页面包含了一个背景、多个下落的蛋糕图片和一个左右移动的loopy图片,实现了一个小熊吃蛋糕的效果 演示效果 HTML&CSS <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>ideal life</title><style…

电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用

文章目录 前言一. system函数1.1 system函数清理屏幕1.2 system函数暂停运行1.3 system函数电脑关机、重启 二、strcmp函数三、goto语句四、电脑关机小游戏4.1. 程序要求4.2. 游戏代码 总结 前言 今天我们写一点稍微有趣的代码&#xff0c;比如写一个小程序使电脑关机&#xf…

OpenSSL 自建CA 以及颁发证书(网站部署https双向认证)

前言 1、前面写过一篇 阿里云免费ssl证书申请与部署&#xff0c;大家可以去看下 一、openssl 安装说明 1、这部分就不再说了&#xff0c;我使用centos7.9&#xff0c;是自带 openssl的&#xff0c;window的话&#xff0c;要去下载安装 二、CA机构 CA机构&#xff0c;全称为…

在M3上面搭建一套lnmp环境

下载docker-desktop 官网下载docker-desktop 切换镜像源 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docke…

WebSocket 通信说明与基于 ESP-IDF 的 WebSocket 使用

一、 WebSocket 出现的背景 最开始 客户端&#xff08;Client&#xff09; 和 服务器&#xff08;Server&#xff09; 通信使用的是 HTTP 协议&#xff0c;HTTP 协议有一个的缺陷为&#xff1a;通信只能由客户端&#xff08;Client&#xff09;发起。 在一些场景下&#xff0…