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

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

引言

建造者模式(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.mfbz.cn/a/800228.html

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

相关文章

Spring Boot 集成 RabbitMQ

依赖与配置 在 pom.xml 中引入 RabbitMQ 相关依赖 <!-- AMQP 依赖, RabbitMq --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>3.2.7</version> &…

详解注意力机制上篇【RNN,Seq2Seq(Encoder-Decoder,编码器-解码器)等基础知识】

NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 &#x1f525; 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;理解和生成自然语言的能力对于构建智能系统至关重要。从文本分类、机器翻…

昇思25天学习打卡营第22天|基于MindSpore的红酒分类实验

基于MindSpore的红酒分类实验 K近邻算法实现红酒聚类 1、实验目的 了解KNN的基本概念&#xff1b;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;…

WSL-Ubuntu20.04环境使用YOLOv8 TensorRT推理加速

在阅读本章内容之前&#xff0c;需要把部署环境以及训练环境都安装好。 1.TensorRTX下载 这里使用Wang-xinyu大佬维护的TensorRTX库来对YOLOv8进行推理加速的演示&#xff0c;顺便也验证一下前面环境配置的成果。 github地址&#xff1a;GitHub - wang-xinyu/tensorrtx&#x…

SourceTree rebase(变基)的使用

参考资料 【Sourcetree】コミットを一つにまとめる【Sourcetree】リベースする 目录 前提0.1 merge与rebase0.2 merge合并分支0.3 rebase合并分支0.4 &#x1f4a5;超级注意事项&#x1f4a5; 一. 代码已提交&#xff0c;未推送&#xff0c;交互式变基1.1 通过SourceTree操作1…

Richtek立锜科技可用于智能门铃的电源管理解决方案

新型的智能门铃不仅能满足呼叫、提醒的需要&#xff0c;还能在线监控、远程操作、闯入通知、记录过程&#xff0c;系统构成相对复杂&#xff0c;与传统门铃相比有了很大的改变。 从电源管理的角度来观察&#xff0c;满足这样需求的系统构成也相对复杂&#xff1a; 处于外置状态…

ElementUIV12相关使用方法

今日内容 零、 复习昨日 零、 复习昨日 一、Element UI Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 官网&#xff1a; https://element.eleme.cn/#/zh-CN Element Plus,基于 Vue 3&#xff0c;面向设计师和开发者的组件库 官网: htt…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据&#xff0c;我们生成了多种图表&#xff0c;包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

从产品手册用户心理学分析到程序可用性与易用性的重要区别

注&#xff1a;机翻&#xff0c;未校对。 Designing for People Who Have Better Things To Do With Their Lives 为那些生活中有更重要事情要做的人设计 When you design user interfaces, it’s a good idea to keep two principles in mind: 在设计用户界面时&#xff0c;…

微软Office PLUS办公插件下载安装指南

微软OfficePLUS插件下载安装指南 简介&#xff1a; OfficePLUS微软官方出品的Office插件 &#xff0c;OfficePLUS拥有30万高质量模板素材&#xff0c;能帮助Word、Excel、Powerpoint、PDF等多种办公软件提升效率&#xff0c;具有智能化、模板质量高、运行快、稳定性强等优点。…

探索Facebook:数字社交的魔力源泉

在当今信息爆炸和全球互联的时代&#xff0c;社交媒体平台成为了人们生活中不可或缺的一部分。而在这些平台中&#xff0c;Facebook无疑是最具影响力和创新性的代表之一。自2004年成立以来&#xff0c;Facebook不仅改变了人们的沟通方式&#xff0c;更通过不断的技术创新和用户…

Pycharm与Gitlab交互

环境准备 1、下载配置好本地Git 2、配置Pycharm上的Git 3、gitlab账号 Gitlab配置 Gitlab配置中文 账号》设置》偏好设置》简体中文 创建项目 命令行操作 打开项目会展示以下步骤 在pycharm克隆gitlab的项目 通过菜单栏 1、在PyCharm的顶部菜单栏中&#xff0c;选择“V…

探索智能合约在金融科技中的前沿应用与挑战

随着区块链技术的发展和普及&#xff0c;智能合约作为其核心应用之一&#xff0c;在金融科技&#xff08;FinTech&#xff09;领域中展现出了巨大的潜力和挑战。本文将深入探讨智能合约的基本概念、前沿应用案例&#xff0c;以及面临的技术挑战和发展趋势&#xff0c;旨在帮助读…

R语言进行集成学习算法:随机森林

# 10.4 集成学习及随机森林 # 导入car数据集 car <- read.table("data/car.data",sep ",") # 对变量重命名 colnames(car) <- c("buy","main","doors","capacity","lug_boot","safety"…

昇思25天学习打卡营第11天|RNN实现情感分类

概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film is great 正确标…

SpringBoot之健康监控(Actuator)

1&#xff0c;基本介绍 Spring Actuator 是 Spring Boot 提供的一个扩展模块&#xff0c;用于监控和管理应用程序的生产环境。它通过 HTTP 端点暴露了大量的监控和管理功能&#xff0c;使得开发者可以在运行时查看应用程序的运行状况、配置信息、性能指标等。 主要功能&#…

【Qt】探索Qt框架:开发经典贪吃蛇游戏的全过程与实践

文章目录 引言项目链接&#xff1a;1. Qt框架的使用简介2. 贪吃蛇游戏设计2.1 游戏规则和玩法介绍2.2 游戏界面设计概述 3. 核心代码解析3.1 主界面&#xff08;GameHall&#xff09;3.1.1 布局和功能介绍3.1.2 代码实现分析 3.2 游戏选择界面&#xff08;GameSelect&#xff0…

WPF+MvvmLight 项目入门完整教程(一)

WPF+MvvmLight入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架…

redis原理之底层数据结构(二)-压缩列表

1.绪论 压缩列表是redis最底层的结构之一&#xff0c;比如redis中的hash&#xff0c;list在某些场景下使用的都是压缩列表。接下来就让我们看看压缩列表结构究竟是怎样的。 2.ziplist 2.1 ziplist的组成 在低版本中压缩列表是由ziplist实现的&#xff0c;我们来看看他的结构…

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】

项目场景&#xff1a; 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时&#xff0c;会发现这个文件下载的默认保存位置和我们预想的不太一样&#xff0c;容易找不到&#xff0c;而且没有提示&#xff0c;那么我们就需要把文件打开自己保存并且有提示保存到哪个…