Java设计模式——建造者模式

目录

前言

一、什么是建造者模式

二、建造者模式的核心角色

三、建造者模式的优点

四、具体实现

1、抽象建造者类 

2、具体建造者类

3、产品类

4、指挥者类

5、客户端代码

总结


前言

        在软件工程中,我们经常遇到需要创建复杂对象的情况。这些对象可能由多个部件组成,各个部件的创建和组装可能涉及复杂的逻辑。为了解决这个问题,我们可以使用一种设计模式:建造者模式(Builder Pattern)。它使用多个简单的对象一步一步构建成一个复杂的对象,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。

一、什么是建造者模式

        建造者模式的核心目的是将一个对象的创建过程与它的最终表示分离开来,这样做的好处是可以用相同的创建过程来生成不同的结果。这种模式通过解耦对象的构造和表示,增加了系统的灵活性和组件的可重用性。以肯德基的套餐为例:汉堡、可乐、薯条、炸鸡翅等可以看作是产品的各个部分,它们各自的准备方式相对固定。然而,顾客的选择——即这些食品的组合方式——却各不相同,从而形成了各式各样的套餐。生成器模式允许我们定义一个通用的流程(创建套餐的过程),而具体的实现(不同套餐的细节)则可以变化,满足不同顾客的需求。在这个例子中,"构建过程"就是选择和组合各种食物成套餐的过程,而"表示"则是具体的套餐内容。生成器模式通过允许我们在不改变构建过程的情况下改变最终产品的表示,就像我们可以在不改变点餐流程的情况下,根据顾客的喜好提供不同的套餐组合。这样不仅提高了点餐系统的效率,还增强了顾客满意度,因为他们可以得到他们想要的确切套餐。

二、建造者模式的核心角色

  1. 产品(Product): 这是最终要创建的复杂对象。
  2. 建造者(Builder): 这个接口定义了创建和装配产品的各个部件所需的方法。
  3. 具体建造者(ConcreteBuilder): 实现了建造者接口。它知道如何实际构建和装配产品的部件。
  4. 指挥者(Director): 它负责安排已有模块的顺序,然后告诉建造者开始建造。

三、建造者模式的优点

  • 封装性: 由于具体的建造者隐藏了产品的组装过程,所以可以更轻松地改变产品的内部表示。
  • 构建和表示分离: 使用不同的建造者可以构建相同的产品,但是表示不同。
  • 可重用性: 一个建造者可以被用来多次构建不同的表示。

四、具体实现

        以建房子为例子,以下是某房屋建筑的需求描述。建房子的过程都依次为:打地基(buildBase)——>,砌墙(buildWall)——>,封顶 (buildRoof);建造的房子有多样,如普通房子(CommonHouse),高楼(HighBuilding),别墅(Villa)等; 各种房子的建造过程虽然一样,但是具体要求各不相同,即不同的房子有不同的属性, 如地基(base),墙(wall),屋顶(roof)等属性各不相同。

1、抽象建造者类 

代码如下(示例):

// 抽象建造者类
abstract class HouseBuilder {
    protected String base;
    protected String wall;
    protected String roof;

    public void buildBase() {
        this.base = "Cement Base";
    }

    public void buildWall() {
        this.wall = "Brick Wall";
    }

    public void buildRoof() {
        this.roof = "Tile Roof";
    }

    public abstract House getHouse();
}

2、具体建造者类

代码如下(示例):

// 具体建造者类
class CommonHouseBuilder extends HouseBuilder {
    @Override
    public House getHouse() {
        return new House(base, wall, roof);
    }
}

class HighBuildingBuilder extends HouseBuilder {
    @Override
    public House getHouse() {
        return new House(base, wall, roof);
    }
}

class VillaBuilder extends HouseBuilder {
    @Override
    public House getHouse() {
        return new House(base, wall, roof);
    }
}

3、产品类

代码如下(示例):

// 产品类
class House {
    private String base;
    private String wall;
    private String roof;

    public House(String base, String wall, String roof) {
        this.base = base;
        this.wall = wall;
        this.roof = roof;
    }

    @Override
    public String toString() {
        return "House{" +
                "base='" + base + '\'' +
                ", wall='" + wall + '\'' +
                ", roof='" + roof + '\'' +
                '}';
    }
}

4、指挥者类

代码如下(示例):

// 指挥者类
class ConstructionManager {
    public House constructHouse(HouseBuilder builder) {
        builder.buildBase();
        builder.buildWall();
        builder.buildRoof();
        return builder.getHouse();
    }
}

5、客户端代码

代码如下(示例):

// 客户端代码
public class Main {
    public static void main(String[] args) {
        ConstructionManager manager = new ConstructionManager();
        House commonHouse = manager.constructHouse(new CommonHouseBuilder());
        System.out.println(commonHouse);

        House highBuilding = manager.constructHouse(new HighBuildingBuilder());
        System.out.println(highBuilding);

        House villa = manager.constructHouse(new VillaBuilder());
        System.out.println(villa);
    }
}

        在这个例子中,我们定义了一个抽象建造者类HouseBuilder,它包含了建造房屋所需的基本方法。然后,我们为每种类型的房屋创建了具体的建造者类,如CommonHouseBuilderHighBuildingBuilderVillaBuilder。这些具体的建造者类继承了抽象建造者类,并实现了getHouse()方法来返回特定类型的房屋对象。我们还定义了一个指挥者类ConstructionManager,它负责指导房屋的构建过程。在客户端代码中,我们创建了一个ConstructionManager对象,并使用它来构建不同类型的房屋对象。通过这种方式,我们可以灵活地构建不同类型的房屋,而不需要修改现有的代码。

总结

        建造者模式是一种强大的工具,可以帮助我们更好地组织和管理复杂对象的创建过程。通过将对象的构建过程与其表示分离,我们可以更灵活地控制对象的创建,并提高代码的可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/676165.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB CRUD操作:地理位置查询中的GeoJSON对象

MongoDB CRUD操作:地理位置查询中的GeoJSON对象 文章目录 MongoDB CRUD操作:地理位置查询中的GeoJSON对象Point类型LineString类型Polygon(多边形)类型单环多边形多环多边形 MultiPoint类型MultiLineString类型MultiPolygon类型Ge…

[FreeRTOS 基础知识] 堆

文章目录 堆的概念使用C语言实现 堆堆空间解析 堆的概念 所谓的堆就是一块空间的内存,可以来管理这块内存。从这块内存中取出一部分然后再释放回去。 使用C语言实现 堆 char heap_buf[1024]; // 定义一个堆空间 int pos0; // 当前…

牛客网刷题 | BC116 [NOIP2013]记数问题

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 试计算在区间1 到n…

C++的vector使用优化

我们在上一章说了如何使用这个vector动态数组,这章我们说说如何更好的使用它以及它是如何工作的。当你创建一个vector,然后使用push_back添加元素,当当前的vector的内存不够时,会从内存中的旧位置复制到内存中的新位置&#xff0c…

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

【动手学深度学习】softmax回归的简洁实现详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 softmax回归的简洁实现 🌍3.2 基础练习 🌊4. 研究体会 🌊1. 研究目的 理解softmax回归的原理和基本实现方式;学习如何…

prometheus+alertmanager+webhook钉钉机器人告警

版本:centos7.9 python3.9.5 alertmanager0.25.0 prometheus2.46.0 安装alertmanager prometheus 配置webhook # 解压: tar -xvf alertmanager-0.25.0.linux-amd64.tar.gz tar -xvf prometheus-2.46.0.linux-amd64.tar.gz mv alertmanager-0.25.0.linu…

分享毕业论文要怎么写以及写论文工具推荐

毕业论文的写作是一个系统且需要深度研究的过程。以下将分步介绍毕业论文的写作方法,并推荐一些实用的写作工具。 毕业论文写作方法 选题: 确定研究方向和目标,选择具体且有一定研究价值的课题。建议选择应用型题目,结合理论和实…

【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解

【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解 针对权限等级,相对于主体来说,会有不同的细分概念。 一、权限APL等级: 首先在鸿蒙系统中,对于权限本身,分为三个等级:normal,s…

【JAVA WEB实用与优化技巧】如何使用本地.bat/.sh脚本快速将服务发布到测试环境?

文章目录 普通方式的springboot 使用docker打包发布【手动构建镜像模式】1. maven 打包可运行jar包2.手动打包镜像3.运行容器 全自动化本地命令发布到远程服务的方式配置ssh信任公钥获取公钥git 获取公钥方式: 桌面右键 -> open git gui here -> help -> show SSH key…

【数据库】MySQL表的操作

目录 一.创建表 二.查看表 三.修改表 四.删除表 一.创建表 基本语法: CREATE TABLE table_name(field1 datatype,field2 datatype,field3 datatype) character set 字符集 collate 校验规则 engine 储存引擎field表示列名 datatype表示列的类型 charatcer se…

初识C++ · 模拟实现stack和Queue

目录 前言: 1 Stack 1.1 双端队列 2 Queue 前言: 经历了list三个自定义类型的洗礼,来个简单的放松放松,即栈和队列: 文档记录的,栈和队列是一种容器适配器,它们不属于stl,但是它…

什么是云渲染?怎么使用呢?手把手教你

云渲染是一种利用云计算技术进行图形渲染的服务。它允许用户将渲染任务提交到云端服务器,由远程的计算机集群资源进行渲染操作,完成后再将渲染结果返回给用户。 云渲染技术的优势在于它可以提高渲染效率和质量,支持多任务同时加速渲染&#…

一个被无数人忽视的好项目

这个项目相信大家都在各大短视频平台见过,之前被我忽视了,当时的我自以为它是一时的热度,很快就会凉凉。但现在却生生被打脸了,这其实是非常好变现且流量也很大的一个好项目。 到底是什么好项目呢,没错,就…

[MYSQL]合作过至少三次的演员和导演

ActorDirector 表: ---------------------- | Column Name | Type | ---------------------- | actor_id | int | | director_id | int | | timestamp | int | ---------------------- timestamp 是这张表的主键(具有唯一值的列).编写解决方案…

黑马程序员——Spring框架——day04——SpringMVC基础

目录: SpringMVC简介 背景SpringMVC概述技术体系定位快速入门 目的需求步骤代码实操测试工具 PostMan简介PostMan安装PostMan使用知识点总结请求与参数处理 请求路径 环境准备问题分析解决方式请求方式 环境准备技术分析参数 基本数据类型POJO嵌套POJO数组集合&…

基于卷积神经网络(CNN)的深度迁移学习在声发射(AE)监测螺栓连接状况的应用

螺栓结构在工业中用于组装部件,它们在多种机械系统中扮演着关键角色。确保这些连接结构的健康状态对于航空航天、汽车和建筑等各个行业至关重要,因为螺栓连接的故障可能导致重大的安全风险、经济损失、性能下降和监管合规问题。 在早期阶段检测到螺栓松动…

四、利用启发式算法进行特定数据集的残差网络结构搜索【框架+源码】

背景:工作之后干的事情跟算法关联甚少,整理下读书期间的负责和参与的work,再熟悉学习下。 边熟悉边整理喽~ CV Tradictional workCV AI based work机械臂视觉抓取项目机器学习全流程 Pipeline训练平台OCR生产线喷码识别三维重建(SfM)ROS机器人…

springboot项目通过jar包部署到服务器

1. 将springboot项目打包成jar包 方式一:IDEA为例 出现 BUILD SUCCESS 证明打包成功,自动生成了 target 目录, jar 包就在目录里边 方式二:命令行(得配置好maven环境变量) 切换到项目目录下,…

springboot管理的各依赖版本查看

找一个springboot相关的依赖,比如这里我找mybatis 鼠标点击artifactId名称,图中蓝色字段,跳转到springboot依赖(鼠标悬停在上面变成蓝色表示可点击跳转), 点击spring-boot-dependencites,跳转到…