重读Java设计模式: 深入探讨建造者模式,构建复杂对象的优雅解决方案

本文主要是介绍重读Java设计模式: 深入探讨建造者模式,构建复杂对象的优雅解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

在软件开发中,有时需要构建具有复杂结构的对象,如果直接使用构造函数或者 setter 方法逐个设置对象的属性,会导致代码变得冗长、难以维护,并且容易出错。为了解决这个问题,我们可以使用建造者模式。

一、建造者模式概述

建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式常用于构建具有复杂结构的对象,例如包含多个部件的对象,或者对象的构建过程需要进行多个步骤。

二、建造者模式的结构

建造者模式包含以下几个角色:

  • 产品(Product):要构建的复杂对象,它由多个部件组成。
  • 抽象建造者(Builder):定义了构建产品的抽象方法,具体建造者类将实现这些方法来构建具体的产品。
  • 具体建造者(Concrete Builder):实现了抽象建造者定义的方法,负责构建产品的各个部件,并返回构建后的产品。
  • 指挥者(Director):负责使用建造者构建产品的对象,它通常不了解具体的构建过程,只负责按照指定的步骤调用建造者的方法来构建产品。

三、建造者模式的优点

  • 分步构建:将构建过程分步进行,每一步都由具体建造者负责,可以更加精细地控制构建过程。
  • 隔离复杂性:将构建过程与产品的表示分离,使得构建过程的变化不会影响产品的表示,从而提高了系统的灵活性和可维护性。
  • 复用性:可以使用相同的构建过程来构建不同的产品,提高了代码的复用性。
  • 逐步完善:可以逐步完善构建过程,根据需求的变化灵活地调整构建过程。

四、建造者模式的应用场景

  • 需要构建的产品具有复杂的内部结构,包含多个部件。
  • 需要构建的产品的构建过程需要进行多个步骤,并且每个步骤的实现方式可能不同。
  • 需要构建的产品的属性之间存在一定的约束关系,需要按照一定的顺序来构建产品。

五、建造者模式的示例代码

我们先来看下相关 UML 图

image-20240331101403448

  • 产品角色
package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public class Car {private Wheel wheel;private SteeringWheel steeringWheel;public Wheel getWheel() {return wheel;}public void setWheel(Wheel wheel) {this.wheel = wheel;}public SteeringWheel getSteeringWheel() {return steeringWheel;}public void setSteeringWheel(SteeringWheel steeringWheel) {this.steeringWheel = steeringWheel;}@Overridepublic String toString() {return "Car{" +"wheel=" + wheel +", steeringWheel=" + steeringWheel +'}';}
}package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public interface SteeringWheel {String steeringWheel();
}package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public class XiaomiSteeringWheel implements SteeringWheel {@Overridepublic String steeringWheel() {return "小米轮毂";}
}package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public interface Wheel {String wheelType();
}package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public class XiaomiWheel implements Wheel{@Overridepublic String wheelType() {return "小米方向盘";}
}
  • 抽象构建者
package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public abstract class CarBuilder {protected Car car = new Car();public abstract CarBuilder buildWheel(Wheel wheel);public abstract CarBuilder buildSteeringWheel(SteeringWheel steeringWheel);public Car builder() {return car;}
}
  • 具体构建者
package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public class CommonCarBuilder extends CarBuilder {@Overridepublic CarBuilder buildWheel(Wheel wheel) {this.car.setWheel(wheel);return this;}@Overridepublic CarBuilder buildSteeringWheel(SteeringWheel steeringWheel) {this.car.setSteeringWheel(steeringWheel);return this;}
}
  • 指挥官
package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public interface Director<T> {T construct();
}package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description: 小米制造商*/
public class XiaoMiDirector implements Director<Car> {private CarBuilder carBuilder;public XiaoMiDirector(CarBuilder carBuilder) {this.carBuilder = carBuilder;}@Overridepublic Car construct() {carBuilder.buildWheel(new XiaomiWheel());carBuilder.buildSteeringWheel(new XiaomiSteeringWheel());return carBuilder.builder();}
}
  • 客户端
package com.markus.desgin.mode.creational.builder;/*** @Author: zhangchenglong06* @Date: 2024/3/7* @Description:*/
public class Client {public static void main(String[] args) {CarBuilder carBuilder = new CommonCarBuilder();Director<Car> director = new XiaoMiDirector(carBuilder);Car car = director.construct();System.out.println(car);}
}

六、建造者模式在 Spring 中的应用

在Spring框架中,有几个组件使用了建造者模式的思想来构建复杂对象,其中包括:

  1. RestTemplateBuilderRestTemplateBuilder是用于构建RestTemplate实例的建造者。RestTemplate是Spring提供的用于访问Restful服务的工具类,它支持各种HTTP请求方法和数据交换格式,如JSON和XML。RestTemplateBuilder提供了一系列方法来配置RestTemplate的各种属性,例如连接超时、读取超时、拦截器等,使得构建RestTemplate实例更加灵活和便捷。
  2. WebMvcConfigurerWebMvcConfigurer是Spring MVC框架中的一个接口,用于配置Web MVC的行为。在Spring Boot应用程序中,通常会创建一个实现了WebMvcConfigurer接口的配置类来自定义Web MVC的行为。通过实现WebMvcConfigurer接口,可以通过覆盖其中的方法来配置拦截器、消息转换器、视图解析器等各种组件,从而实现对Spring MVC框架的定制化。这种灵活性和可定制性正是建造者模式的优势之一。
  3. SqlSessionFactoryBean: 在Spring中使用MyBatis进行持久化操作时,通常会配置一个SqlSessionFactoryBean实例来创建SqlSessionFactory对象。SqlSessionFactory是MyBatis框架中的核心接口,用于创建SqlSession对象,通过SqlSession对象可以执行SQL语句并与数据库进行交互。SqlSessionFactoryBean提供了一系列方法来配置MyBatis的各种属性,例如数据源、类型别名、Mapper扫描等,使得创建SqlSessionFactory实例更加灵活和可配置。

这些组件在Spring框架中使用建造者模式的思想,通过提供一系列的配置方法来构建复杂的对象实例,使得对象的创建过程更加灵活和可定制。

七、设计模式百宝箱

在本节,我们开始填充我们的百宝箱:

  • 面向对象基础
    • 抽象
    • 封装
    • 多态
    • 继承
  • 面向对象原则
    • 依赖抽象,不要依赖具体类
    • 针对接口编程,不针对具体实现编程
    • 类应该对扩展开放,对修改关闭
    • 为交互对象之间的松耦合设计而努力
  • 面向对象设计模式
    • 简单工厂模式:定义了一个创建对象的接口,将创建对象的内容从客户端抽离出来
    • 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
    • 原型模式:通过复制现有对象来创建新对象,提高代码效率和可维护性
    • 建造者模式:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示

八、总结

建造者模式是一种创建型设计模式,通过将构建过程与产品的表示分离,使得同样的构建过程可以创建不同的表示。本文介绍了建造者模式的概念、结构、优点、应用场景,并提供了示例代码进行说明。建造者模式可以有效地解决构建复杂对象时的代码冗长、难以维护的问题,是一种值得推荐的设计模式。

这篇关于重读Java设计模式: 深入探讨建造者模式,构建复杂对象的优雅解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864295

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。