Java二十三种设计模式-建造者模式(4/23)

news2024/9/22 7:29:17

建造者模式:构建复杂对象的专家

引言

建造者模式(Builder Pattern)是一种创建型设计模式,用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,它将对象的构建和表示分离,使得相同的构建过程可以创建出不同的表示。

基础知识,java设计模式总体来说设计模式分为三大类:

(1)创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(2)结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

(3)行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

第一部分:建造者模式概述

建造者模式是一种高级的创建型设计模式,旨在提供一种灵活的解决方案,用于创建复杂的对象。

1.1 定义与用途

建造者模式的基本定义

建造者模式将一个复杂对象的构建过程封装起来,同时允许按步骤构造对象。它允许用户通过相同的创建过程生成不同的表示。

为何在复杂对象的创建中需要建造者模式

  • 分离构建和表示:将对象的构建过程从其表示中分离出来,使得构建过程不会影响对象的使用。
  • 控制复杂性:对于包含多个组成部分的复杂对象,建造者模式可以逐步构建对象,而不是一次性完成,从而简化了构建过程。
  • 增强灵活性:允许系统在构建过程中的不同阶段进行修改,而不影响其他部分。

1.2 组成元素

产品(Product)

  • 定义:最终要创建的复杂对象。
  • 角色:通常是多个简单对象的组合体,由建造者模式逐步构建。

建造者(Builder)

  • 定义:一个接口,定义了创建产品的方法。
  • 角色:提供了一个抽象接口,使得不同的建造者可以构建同一产品的不同表示。

导演者(Director)

  • 定义:负责使用建造者来创建产品的类。
  • 角色:它知道如何使用建造者来得到最终的产品,通常持有一个建造者对象,并使用该对象的构建方法来创建产品。

具体建造者(Concrete Builder)

  • 定义:实现建造者接口的具体类。
  • 角色:实现具体的构建过程,通常包含一个产品对象,并定义了如何构建该产品的步骤。

客户端(Client)

  • 角色:使用导演者和建造者来获取最终的产品,客户端不直接与产品或具体建造者交互。

角色之间的交互

  • 客户端:通过导演者请求产品。
  • 导演者:使用具体建造者来构建产品。
  • 具体建造者:实现建造者接口,负责构建产品的具体步骤。

建造者模式特别适合于那些需要通过多个步骤来构建的对象,且这些步骤可能因不同的使用场景而异。通过使用建造者模式,我们可以在不牺牲对象的完整性和一致性的情况下,提供灵活的对象创建过程。在下一部分中,我们将通过Java代码示例来展示建造者模式的具体实现。

第二部分:建造者模式实现

2.1 Java实现示例

以下是使用Java语言实现建造者模式的一个示例。假设我们正在构建一个复杂的汽车对象,汽车由多个部件组成,如引擎、轮胎等。

// 产品接口
interface Car {
    void assembleEngine();
    void assembleWheels();
    // 其他组装方法...
}

// 具体产品
class SportsCar implements Car {
    public void assembleEngine() {
        System.out.println("Assembling sports car engine.");
    }

    public void assembleWheels() {
        System.out.println("Assembling sports car wheels.");
    }
    // 其他组装方法实现...
}

// 建造者接口
interface CarBuilder {
    CarBuilder setEngine();
    CarBuilder setWheels();
    // 其他设置方法...
    Car build();
}

// 具体建造者
class SportsCarBuilder implements CarBuilder {
    private SportsCar car;

    public SportsCarBuilder() {
        this.car = new SportsCar();
    }

    public CarBuilder setEngine() {
        car.assembleEngine();
        return this;
    }

    public CarBuilder setWheels() {
        car.assembleWheels();
        return this;
    }
    
    // 其他设置方法...

    public Car build() {
        return car;
    }
}

// 导演者
class CarDirector {
    public Car construct(CarBuilder builder) {
        return builder.setEngine().setWheels().build();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        CarBuilder builder = new SportsCarBuilder();
        CarDirector director = new CarDirector();
        
        Car car = director.construct(builder);
        // 使用car...
    }
}

2.2 模式中的角色和职责

产品(Product)

  • 职责:定义最终要创建的复杂对象的接口。

建造者(Builder)

  • 职责:定义一个抽象接口,用于创建产品的不同部分。

导演者(Director)

  • 职责
    • 负责构建产品的步骤顺序。
    • 使用建造者接口来创建产品。

具体建造者(Concrete Builder)

  • 职责
    • 实现建造者接口,提供具体的构建步骤实现。
    • 存储产品的状态,并返回一个完整的产品。

客户端(Client)

  • 职责
    • 通过导演者使用建造者来获取最终的产品。
    • 客户端不直接与具体建造者交互,而是通过导演者和建造者接口。

相互作用

  • 客户端:请求导演者构建产品。
  • 导演者:通过调用具体建造者的方法,按照既定的顺序创建产品。
  • 具体建造者:实现具体的构建步骤,最终返回一个完整的产品。

建造者模式允许系统在创建复杂对象时保持灵活性和可扩展性。通过将构建过程封装在具体建造者中,导演者可以灵活地改变构建过程,而客户端则可以保持不变。在下一部分中,我们将探讨建造者模式的使用场景。

 

第三部分:建造者模式使用场景

3.1 复杂对象的构建

在软件开发中,有时我们需要构建的对象非常复杂,可能包含多个组件和配置选项。当对象的构建过程复杂时,建造者模式提供了一种清晰和灵活的方式来组织代码。

何时对象构建过程复杂:

  • 当对象的构造函数参数列表过长,难以管理时。
  • 当对象的创建需要多个步骤,且步骤之间存在条件逻辑时。

建造者模式的应用:

  • 通过将构建过程分解为一系列步骤,建造者模式简化了复杂对象的创建。
  • 它允许逐步设置对象的属性,而不是一次性在构造函数中完成。

3.2 对象的多样性

在某些情况下,我们需要构建的对象可能有多种变体,每种变体都有不同的属性和构建步骤。

建造者模式的优势:

  • 灵活性:可以轻松地添加或修改特定变体的构建步骤,而不影响其他变体。
  • 可维护性:通过将不同的构建步骤封装在不同的建造者中,提高了代码的可维护性。
  • 一致性:确保所有变体都通过相同的建造过程进行构建,保证了对象的一致性。

第四部分:建造者模式的优点与缺点

4.1 优点

灵活性

  • 建造者模式允许在构建过程中轻松地添加或修改步骤,从而创建不同的对象变体。

可扩展性

  • 当需要添加新的对象变体时,可以通过添加新的建造者来实现,而无需修改现有代码。

解耦

  • 客户端代码与对象的构建过程解耦,客户端不需要知道对象是如何构建的。

代码复用

  • 导演者可以使用相同的建造者来构建不同类型的产品,提高了代码的复用性。

4.2 缺点

系统复杂度

  • 引入建造者模式可能会增加系统的复杂度,特别是在建造者和产品类数量较多的情况下。

性能问题

  • 如果对象的构建过程非常简单,使用建造者模式可能会引入不必要的性能开销。

学习曲线

  • 对于新手来说,建造者模式可能比简单的构造函数或工厂方法更难理解。

建造者模式是一种强大的设计模式,适用于构建复杂且多变的对象。然而,它也需要谨慎使用,以避免不必要的复杂性和性能问题。在下一部分中,我们将比较建造者模式与其他设计模式,并提供一些最佳实践和建议。

第五部分:建造者模式与其他模式的比较

5.1 与工厂方法模式的比较

工厂方法模式

  • 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
  • 使用场景:当创建逻辑相对简单,且创建的对象种类较少时。

建造者模式

  • 定义:允许通过指定复杂对象的类型和内容来构建它们。
  • 使用场景:当创建的对象非常复杂,或者创建过程包含多个步骤时。

不同点

  • 复杂性:工厂方法模式适用于创建对象的逻辑相对简单的情况,而建造者模式适用于创建复杂对象。
  • 灵活性:建造者模式提供了更灵活的构建过程,允许逐步构建对象。

5.2 与抽象工厂模式的对比

抽象工厂模式

  • 定义:提供一个接口,用于创建一系列相关或相互依赖的对象。
  • 使用场景:当需要创建多个产品族,并且这些产品族之间存在依赖关系时。

建造者模式

  • 定义:允许用户通过指定复杂对象的类型和内容来构建它们。
  • 使用场景:当需要构建的对象具有多个组成部分,并且构建过程可能非常复杂时。

不同点

  • 产品族:抽象工厂模式关注于创建多个产品族,而建造者模式关注于构建单个复杂对象。
  • 依赖性:抽象工厂模式中的产品通常相互依赖,建造者模式则关注于单个对象的构建过程。

第六部分:最佳实践和建议

6.1 使用建造者模式的最佳时机

  • 复杂对象:当对象的构建涉及多个步骤或多个组成部分时。
  • 灵活性需求:当需要不同的构建过程来创建相同类型的对象时。

6.2 避免滥用建造者模式

  • 过度设计:避免在对象构建过程非常简单时使用建造者模式,这可能会导致不必要的复杂性。
  • 性能问题:在构建过程非常快速且不需要额外灵活性的情况下,使用建造者模式可能会引入不必要的性能开销。

6.3 替代方案

原型模式

  • 定义:通过复制现有的对象来创建新的实例。
  • 适用场景:当创建新对象的成本较高,或者需要快速复制现有对象时。

单例模式

  • 定义:确保一个类只有一个实例,并提供一个全局访问点。
  • 适用场景:当需要严格控制对象数量,确保全局只有一个实例时。

工厂方法模式

  • 适用场景:当创建对象的逻辑相对简单,且创建的对象种类较少时。

建造者模式是一种强大的设计模式,适用于构建复杂对象的场景。然而,合理选择使用时机和避免滥用同样重要。了解替代方案可以帮助开发者根据具体需求选择最合适的设计模式。

结语

建造者模式是处理复杂对象创建问题的有效工具。通过本文的深入分析,希望读者能够对建造者模式有更全面的理解,并在实际开发中做出合理的设计选择。

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

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

相关文章

【计算机毕业设计】002基于weixin小程序家庭记账本

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【JavaEE进阶】——SpringBoot 统⼀功能处理

目录 🚩拦截器 🎈什么是拦截器? 🎈如何使用拦截器 🎓自定义拦截器 🎓注册拦截器 🎈拦截器详解 🎓拦截路径 🎓拦截器执⾏流程 🔴DispatcherServlet 源码分析(了…

手机怎么看WiFi的IP地址

在如今数字化快速发展的时代,无线网络已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们可能都离不开WiFi的陪伴。然而,在使用WiFi的过程中,有时我们可能需要查看其IP地址,以便更好地管理我们的网…

大数据hive表和iceberg表格式

iceberg: https://iceberg.apache.org/ iceberg表,是一种面向大型分析数据集的开放表格式,旨在提供可扩展、高效、安全的数据存储和查询解决方案。它支持多种存储后端上的数据操作,并提供 ACID 事务、多版本控制和模式演化等特性&#xff0c…

K8S 中的 CRI、OCI、CRI shim、containerd

哈喽大家好,我是咸鱼。 好久没发文了,最近这段时间都在学 K8S。不知道大家是不是和咸鱼一样,刚开始学 K8S、Docker 的时候,往往被 CRI、OCI、CRI shim、containerd 这些名词搞得晕乎乎的,不清楚它们到底是干什么用的。…

持续集成01--Git版本管理及基础应用实践

前言 本系列文章旨在深入探讨持续集成/持续部署(Continuous Integration/Continuous Deployment, CI/CD)流程中的各个环节,而本篇将聚焦于Git版本管理及其基本应用。通过本文,读者将了解到Git的基本原理、安装配置、基本命令以及如…

当农业遇见智能:机器学习引领农作物管理新时代

机器学习引领农作物管理新时代 1. 引言1.1 农业的重要性和现代农作物管理的挑战1.2 机器学习技术在农业中的潜力和应用前景 2. 机器学习在农作物管理中的基础应用2.1 数据驱动的农业决策数据收集与处理示例代码:传感器数据采集决策支持系统 2.2 传感器技术与数据采集…

ArcGIS Enterprise 命令行组件创建配置

1. 创建ArcGIS Server站点 使用 createsite工具 命令行直接执行 createsite.sh [-u <arg>] [-p <arg>] [-d <arg>] [-c <arg>]执行文件 createsite.sh [-f <FILE>]安装目录下会有类似的创建站点文件&#xff1a; 修改其中的内容&#xff0c;…

python中的re模块--正则表达式

正则表达式&#xff0c;又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科 学的一个概念。正则表达式通常被用来检索、替换那些符合某个模 式(规则)的文本 re模块作用 通过使用…

Android:创建自定义View

点击查看创建自定义view官网文档 一、简介 设计良好的自定义视图与任何其他精心设计的类一样。它通过一个简单的接口封装一组特定的功能&#xff0c;高效使用 CPU 和内存&#xff0c;诸如此类。除了是一个精心设计的类之外&#xff0c;自定义视图还必须执行以下操作&#xff1…

elementui 日历组件el-calendar使用总结

功能&#xff1a; 1.日历可以周视图、月视图切换&#xff1b; 2.点击月视图中日期可以切换到对应周视图&#xff1b; 3.点击周视图查看当日对应数据&#xff1b; 4.周、月视图状态下&#xff0c;点击前后按钮&#xff0c;分别切换对应上下的周、月&#xff1b; 5.点击回到…

MWA(Modern Web App)初学那些事-2-Basic HTML CSS

初学MWA(Modern Web App&#xff09;那些事-2-Basic HTML & CSS 目录 初学MWA(Modern Web App&#xff09;那些事-2-Basic HTML & CSS前言一、本节学习目标二、HTML基础内容2.1关键元素2.4 Scripts 三、CSS 基础内容3.1 级联样式表-用于设置网页样式和布局3.2 CSS规则语…

Docker的虚拟化安装、常用命令和使用案例

文章目录 一、Docker的虚拟机安装1、完成虚拟机的更新2、完成Docker安装3、配置镜像加速器 二、Docker常用命令三、Docker的容器创建四、理解虚拟机中的Docker容器 一、Docker的虚拟机安装 1、完成虚拟机的更新 详见我的文章。 2、完成Docker安装 yum list installed|grep …

筑梦未来,精准构建:Chief Architect Premier X10 for Mac,首席建筑师的专业之选

Chief Architect Premier X10 for Mac&#xff0c;是建筑设计领域的一款顶尖软件&#xff0c;专为追求卓越设计与精准构建的用户量身打造。它融合了先进的3D建模技术与直观的操作界面&#xff0c;让设计师能够轻松实现创意与现实的完美融合。 这款软件提供了丰富的设计工具与资…

axios 下载大文件时,展示下载进度的组件封装——js技能提升

之前面试的时候&#xff0c;有遇到一个问题&#xff1a;就是下载大文件的时候&#xff0c;如何得知下载进度&#xff0c;当时的回复是没有处理过。。。 现在想到了。axios中本身就有一个下载进度的方法&#xff0c;可以直接拿来使用。 下面记录一下处理步骤&#xff1a; 参考…

【C++之C++11特性知识】

C学习笔记---026 C之C11特性知识1、C11特性知识介绍2、auto关键字3、范围for4、列表初始化5、final 与 override关键字6、lambda表达式7、右值引用和移动语义8、智能指针9、类型推导&#xff08;decltype关键字&#xff09;10、参考文档 C之C11特性知识 前言&#xff1a; 前面…

LVS+Nginx高可用集群---keepalived原理与实战

1.高可用集群架构keepalived双机主备原理 高可用&#xff1a;(HA) 部署nginx存在两台nginx。当主节点的nginx宕机停止服务的时候&#xff0c;nginx备用机起到跟nginx(主) keepalived的概念&#xff1a;解决单点故障&#xff1b;组件免费&#xff1b;可以实现高可用HA机制&…

css-grid布局(栅格布局)

css新世界-auto-fit grid 一个比flex更强大的布局,适合做整体布局 grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); auto-fit的话有strech效果gap 不仅可以用于grid 也可用flex. 在grid-template-areas表示这个位置空着grid area 的 [a b]命名可重复命名 表示的…

AutoHotKey自动热键(十一)下载SciTE4AutoHotkey-Plus的中文增强版脚本编辑器

关于AutoHotkey的专用编辑器, SciTE4AutoHotkey是一个免费的基于 SciTE 的 AutoHotkey 脚本编辑器,除了 DBGp 支持, 它还为 AutoHotkey 提供了语法高亮, 调用提示, 参数信息和自动完成, 以及其他拥有的编辑特性和辅助工具.XDebugClient 是一个基于 .NET Framework 2.0 的简单开…

视频号矩阵系统,AI自动生成文案,实现批量上传视频和定时发布

在数字化浪潮席卷全球的今天&#xff0c;视频内容已成为信息传播的重要载体。然而&#xff0c;对于众多自媒体创作者和企业而言&#xff0c;如何高效、精准地发布视频内容&#xff0c;依然是一个不小的挑战。幸运的是&#xff0c;随着技术的不断进步&#xff0c;视频号矩阵系统…