建造者模式:灵活构建复杂对象的利器

news2024/12/26 10:39:53

在软件开发中,创建一个复杂对象通常需要多个步骤和参数,直接在客户端代码中进行这些操作不仅繁琐,而且难以维护。建造者模式(Builder Pattern)提供了一种优雅的解决方案,使得对象的创建过程更加清晰、灵活和可控。

建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。通过使用建造者模式,开发者可以一步一步地构建复杂对象,并且可以根据需要改变构建步骤的顺序和内容。

一,建造者模式的结构

建造者模式主要包括以下四个角色:

  1. 产品(Product):要创建的复杂对象。
  2. 建造者(Builder):定义创建产品各个部分的抽象接口。
  3. 具体建造者(ConcreteBuilder):实现Builder接口,构建和装配产品的各个部分。
  4. 指挥者(Director):控制构建过程,通过调用具体建造者的方法来构建产品。

uml类图:
在这里插入图片描述

二,建造者模式的实现

假设我们要构建一辆汽车(Car),它由多个部件(如引擎、轮子和车身)组成。以下是建造者模式的实现示例:

// 产品类
class Car {
    private String engine;
    private String wheels;
    private String body;

    // Getters and setters
    public void setEngine(String engine) { this.engine = engine; }
    public void setWheels(String wheels) { this.wheels = wheels; }
    public void setBody(String body) { this.body = body; }

    @Override
    public String toString() {
        return "Car with " + engine + ", " + wheels + " wheels, and " + body + " body.";
    }
}

// 抽象建造者
abstract class CarBuilder {
    protected Car car;

    public void createNewCar() { car = new Car(); }
    public Car getCar() { return car; }

    public abstract void buildEngine();
    public abstract void buildWheels();
    public abstract void buildBody();
}

// 具体建造者
class SportsCarBuilder extends CarBuilder {
    public void buildEngine() { car.setEngine("V8 Engine"); }
    public void buildWheels() { car.setWheels("Sport Wheels"); }
    public void buildBody() { car.setBody("Sport Body"); }
}

// 指挥者
class Director {
    private CarBuilder carBuilder;

    public void setCarBuilder(CarBuilder carBuilder) { this.carBuilder = carBuilder; }
    public Car getCar() { return carBuilder.getCar(); }

    public void constructCar() {
        carBuilder.createNewCar();
        carBuilder.buildEngine();
        carBuilder.buildWheels();
        carBuilder.buildBody();
    }
}

// 客户端代码
public class BuilderPatternDemo {
    public static void main(String[] args) {
        Director director = new Director();
        CarBuilder sportsCarBuilder = new SportsCarBuilder();

        director.setCarBuilder(sportsCarBuilder);
        director.constructCar();

        Car car = director.getCar();
        System.out.println(car);
    }
}

三,建造者模式的优缺点及适用场景

优点

  1. 更好的控制:通过分步骤构建对象,可以更好地控制对象的创建过程。
  2. 代码可读性:将复杂对象的创建过程封装在建造者中,使客户端代码更简洁。
  3. 灵活性:可以根据需要改变构建步骤的顺序和内容,甚至可以创建不同的表示。
  4. 解耦:将对象的创建过程与其表示分离,减少了类之间的耦合。

缺点

  1. 复杂性增加:对于简单对象的创建,使用建造者模式可能会增加不必要的复杂性。
  2. 更多的类:引入了额外的建造者和指挥者类,可能会增加代码量。
  3. 学习成本:对于不熟悉设计模式的开发者来说,理解和应用建造者模式可能需要一定的学习时间。

适用场景

  1. 复杂对象的创建:当一个对象的创建过程非常复杂,需要多个步骤和参数时。
  2. 不同表示的对象:当需要创建具有不同表示的对象时。
  3. 不可变对象:当对象创建后不可更改时,建造者模式可以确保对象在创建时就处于有效状态。
  4. 对象复用:通过建造者模式,可以方便地复用对象的创建代码。

结论

建造者模式是一种强大的设计模式,适用于构建复杂对象的场景。通过将对象的创建过程与其表示分离,建造者模式不仅提高了代码的可读性和可维护性,还提供了更大的灵活性。在实际开发中,合理地应用建造者模式可以显著改善代码质量和系统的可扩展性。然而,对于简单对象的创建,需权衡其带来的复杂性和额外的代码量。


如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!

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

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

相关文章

以最小成本实现最大销售:《稻盛和夫的实学:经营与会计》中的企业经营哲学

在《经营与会计》中稻盛和夫提出,会计是现代企业经营的中枢,经营者必须掌握企业活动的真实状态,才能带领企业长期持续的发展。 经营企业要以现金为基础,把握赚的钱在哪里,以什么形式存在,根据手上确凿无疑…

技术分享-商城篇-营销模块-优惠券种类(二十六)

前言 在之前的文章技术分享-商城篇-优惠券管理-功能介绍及种类(二十四) ,有对优惠券设计做了阐述,优惠券作为一种强大的促销工具,不仅能够吸引新客户,还能促进现有客户的复购与订单金额的提升。但是优惠券…

HTML+CSS - 网页布局之网格布局

1. dispaly设置 display是 CSS 中用于设置元素的显示方式的属性。它决定了元素如何被渲染到页面上。不同的display值会改变元素的显示行为,包括布局、排版以及对其他元素的影响。 其中网格容器是最常用的几种方式之一,在文档中创建类似于网格的效果&…

迷你洗衣机哪个牌子好又实惠?5大主流产品综合实测分享!

在日常生活中,内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机,不仅可以减少洗衣负担,还能提供高效的洗涤效果。然而,市场上众多内衣洗衣机品牌琳琅满目,让我们往往难以选择。那么&a…

有性价比高的无线蓝牙耳机吗?四款适合学生党的开放式耳机推荐

最近也是大学生高中生都开学了,我想很多学生都想寻找一款性价比高的真无线蓝牙耳机来提升学习和休闲时的音频体验吧。但是市场上的蓝牙耳机品牌和型号繁多,所以并非所有都适合学生群体的预算和需求。只能是由比较专业的耳机测评专家来推荐给学生党入手了…

git编译安装报错

编译安装步骤 卸载旧的 yum -y remove gitcd /usr/local/src/wget https://www.kernel.org/pub/software/scm/git/git-2.15.1.tar.xztar -vxf git-2.15.1.tar.xzcd git-2.15.1make prefix/usr/local/git allmake prefix/usr/local/git installecho "export PATH$PATH:/usr…

C++教程(一):超详细的C++矩阵操作和运算(附实例代码,与python对比)

python教程(一):超详细的numpy矩阵操作和运算(附实例代码) 在之前的章节中,我们详细介绍了python中numpy的矩阵操作。但在自动驾驶开发中,我们一般采用C进行功能开发,因此C矩阵运算…

8月最新大模型新书-《自然语言处理:大模型理论与实践》(附PDF)西财赵宇教授新作

介绍 本书主要面向高校本科生、研究生及教学科研人员,适合作为教学用书。同时,它也适合计算语言学家、语言学家、数据科学家和NLP开发人员等专业人士使用。为了照顾不同读者的学科背景差异,书中附录部分专门介绍了与NLP密切相关的基础知识&a…

HAL库学习梳理——SPI(收发Flash数据实验)

实验现象:将LED灯的状态保存到Flash里,掉电读取Flash并设置LED。 1,STM32CubeMx 配置 1.1 SPI引脚说明 外设连接 1.2 参数配置 配置工作模式 主机工作模式 SPI 工作参数设置 1.3 GPIO配置 SPI接线配置 SPI引脚的GPIO配置 2,程序…

大模型开源:ChatGLM-6B (介绍以及本地部署)

简介 ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存&#xff…

水位雨量自动监测站的工作原理

水位雨量自动监测站是一种集自动化、智能化于一体的水文监测设施,主要用于实时监测和记录水位及降雨量的变化,为水文预报、水资源管理、防洪减灾等提供科学依据。水位雨量自动监测站主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构…

js读取文件,生成随机题目,多项选择题则提供随机答案供选择

一.第一个要求 根据模板生成随机题目可以将 --- 内的内容 ---变成JSON然后根据参数的限制条件来生成随机参数,再替换到题目中example.md --- Type: Quiz Template Domain: - Geometry Knowledge:- - 數學- 度量、圖形與空間範疇- 弧長和扇形面積- 理解圓的弧長公…

掌握项目全流程:10个项目管理烫知识

一、启动阶段 1、一个清晰且有吸引力的项目愿景对于项目的成功启动至关重要。它能够让所有项目成员以及相关干系人明白项目的最终目标和意义。 在这个阶段,我们可以利用项目管理工具进度猫来可视化地呈现项目的整体愿景,将大的目标拆分成初步的任务板…

RT-DETR训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、RT-DETR简介二、环境搭建三、构建数据集四、修改配置文件①数据集文件配置②模型文件配置③训练文件配置 五、模型训练和测试模型训练模型测试 总结 前言 提示:本文是RT-DETR训练自己数据集的记录教程,需要大家在本地已配置好CUDA,cuD…

302状态如何进行重定向

文章目录 一、302状态是什么意思二、遇到的使用场景三、如何处理customservice.wxmlcustomservice.js 一、302状态是什么意思 302状态码是临时重定向(Move Temporarily),表示所请求的资源临时地转移到新的位置。此外还有一个301永久重定向&a…

【spring】maven引入okhttp的日志拦截器打开增量注解进程

HttpLoggingInterceptor 是在logging-interceptor库中的:这个logging库老找不到 import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor;发现这仨是独立的库 pom中三个依赖 <!-- OKHTTP3 --><

在group by分组的时候,某个key过多导致数据倾斜

解决方案&#xff1a;将 key 打散&#xff0c;给 key 增加随机前缀 在进行 group by 之前&#xff0c;先给每个 user_id 增加一个随机前缀&#xff0c;使得原本相同的 user_id 被打散到不同的分组中。 按带前缀的 key 进行分组 对带有随机前缀的 user_id 进行分组和聚合。 …

重要涉密文件如何防窃取?四个方法有效防止文件泄密【文件保密管理】

随着信息化时代的发展&#xff0c;数据安全问题变得日益突出&#xff0c;特别是对于一些重要的涉密文件&#xff0c;其泄密将带来严重后果。因此&#xff0c;企业和个人在处理机密文件时&#xff0c;必须采取有效的措施来防止文件被窃取。 小编在本文将介绍四个有效的方法&…

三招教你搞定GPU服务器配置→收藏推荐配置

在AI人工智能应用日益渗透各行各业的今天&#xff0c;图形处理器&#xff08;GPU&#xff09;市场呈现出蓬勃发展的态势&#xff0c;其中GPU服务器市场更是炙手可热&#xff0c;其热度始终居高不下。随着人工智能、深度学习、大数据分析等前沿领域的不断拓展与深化&#xff0c;…

python+matplotlib 画一个漂亮的折线统计图

pythonmatplotlib 画一个漂亮的折线统计图 有详细的注释说明…… import matplotlib.pyplot as plt import numpy as np import mathdef draw_line_chart(Line_data_list,title,pic_name)::param Line_data_list: 折线数据源:param title: 图表名称:param pic_name: 保存图片名…