java设计模式学习之【建造者模式】

news2024/11/22 15:59:48

文章目录

  • 引言
  • 建造者模式简介
    • 定义与用途
    • 实现方式:
  • 使用场景
  • 优势与劣势
  • 建造者模式在spring中的应用
  • CD(光盘)的模拟示例
    • UML
  • 订单系统的模拟示例
    • UML
  • 代码地址

引言

建造者模式在创建复杂对象时展现出其强大的能力,特别是当这些对象需要通过多个步骤来构建时。这种模式使得对象的构造过程更加清晰、灵活,同时还有助于保持创建逻辑的封装和代码的整洁。

建造者模式简介

定义与用途

建造者模式是一种创建型设计模式,它允许将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式常用于构建复杂对象,特别是当这些对象的创建过程需要多个步骤时。

实现方式:

建造者模式通常包括以下几个角色:

  • Builder:为创建一个产品对象的各个部件指定抽象接口。
  • ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示,并提供一个检索产品的接口。
  • Director:构造一个使用Builder接口的对象。
  • Product:表示被构造的复杂对象。

使用场景

  • 当需要生成的对象具有复杂的内部结构时。
  • 当需要生成的对象的属性相互依赖时。
  • 当创建对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

优势与劣势

  • 优势
    分离产品的构造和表示:提供更好的控制过程。
    更好的可扩展性:可以更容易地改变一个对象的内部表示。
  • 劣势
    增加了系统的复杂性:需要定义多个Builder。

建造者模式在spring中的应用

在Spring框架中,建造者模式并没有像单例模式或原型模式那样被显著地用作框架的基础结构。不过,Spring确实提供了一些支持建造者模式的特性,尤其是在配置和Bean的构建方面。以下是Spring中建造者模式应用的一些例子:

Spring的链式配置:
Spring框架中的一些组件,如RestTemplateBuilder、SpringApplicationBuilder等,使用了建造者模式的思想,允许开发者通过链式调用方法来配置对象。这种方式简化了对象的构造过程,并使配置过程更加直观和易于理解。

Bean的构建和配置:
在Spring中,尽管Bean的构建大多是基于工厂模式,但可以利用建造者模式来构建复杂的Bean。特别是当Bean有多个属性需要配置,且这些属性之间存在依赖关系时,建造者模式可以提供更清晰和更可维护的方式来构建这些Bean。

Fluent API设计:
Spring 5 引入的WebFlux模块在其Fluent API中广泛采用了建造者模式,使得构建反应式流和请求处理流水线更加直观和便捷。

CD(光盘)的模拟示例

展示了如何使用建造者模式构建一个复杂的产品(这里是CD),包括其不同的品牌和包装。

UML

在这里插入图片描述
步骤 1: 创建 Packing 接口 (Packing.java):

定义了产品(CD)的包装和定价的接口。这个接口提供了pack()和price()两个方法,分别用于获取产品的包装信息和价格。

public interface Packing {
    public String pack();
    public int price();
}

步骤 2: 创建 CD 和 Company 抽象类 (CD.java 和 Company.java):
CD 类实现了 Packing 接口,提供了关于CD包装的基本实现。
Company 类继承自 CD 类,增加了关于价格的抽象方法。这个类代表生产CD的不同公司。

public abstract class CD implements Packing {
    public abstract String pack();
}
public abstract class Company extends CD{
    public abstract int price();
}

步骤3: 创建 Company 的具体实现类:Sony 和 Samsung (Sony.java 和 Samsung.java):
这两个类提供了Sony和Samsung公司生产的CD的具体实现。它们覆盖了价格和包装的方法,为Sony CD和Samsung CD分别提供了具体的价格和包装信息。

public class Samsung extends Company {

    @Override
    public int price() {
        return 15;
    }

    @Override
    public String pack() {
        return "Samsung CD";
    }

}
public class Sony extends Company {

    @Override
    public int price() {
        return 20;
    }

    @Override
    public String pack() {
        return "Sony CD";
    }

}

步骤4: 创建 CDType 类 (CDType.java):
这个类管理一系列的CD产品。它使用一个列表来存储Packing类型的对象,并提供了添加CD和显示CD信息的方法。

public class CDType {

    private List<Packing> items = new ArrayList<Packing>();

    public void addItem(Packing packs) {
        items.add(packs);
    }

    public void showItems() {
        for (Packing packing : items) {
            System.out.print("CD name : " + packing.pack());
            System.out.println(", Price : " + packing.price());
        }
    }

}

步骤5: 创建 CDBuilder 类 (CDBuilder.java):
这个类充当建造者,提供了构建特定品牌CD的方法。buildSonyCD和buildSamsungCD方法分别创建含有Sony和Samsung CD的CDType对象。

public class CDBuilder {

    public CDType buildSonyCD() {
        CDType cds = new CDType();
        cds.addItem(new Sony());
        return cds;
    }

    public CDType buildSamsungCD() {
        CDType cds = new CDType();
        cds.addItem(new Samsung());
        return cds;
    }

}

步骤6: 创建 BuilderDemo 类 (BuilderDemo.java):
这是一个演示类,它使用CDBuilder来创建不同品牌的CD集合,并展示这些CD的信息。

public class BuilderDemo {

    public static void main(String args[]) {
        CDBuilder cdBuilder = new CDBuilder();
        CDType cdType1 = cdBuilder.buildSonyCD();
        cdType1.showItems();

        CDType cdType2 = cdBuilder.buildSamsungCD();
        cdType2.showItems();
    }

}

以上就是一个简单的建造者模式示例代码,运行代码我们可以看到。
在这里插入图片描述

订单系统的模拟示例

以上例子比较简单,相信大家意犹未尽在这里插入图片描述
因此我又找了一个更好了,供大家品鉴

这个示例通过一个比萨饼和冷饮的订单系统,展示了建造者模式在现实世界的应用。它允许用户根据自己的选择定制不同种类和大小的比萨饼和冷饮,并在最后提供了一个总的订单和成本计算。这种方式使得订单的创建过程变得灵活且结构化,同时也保持了代码的清晰和易于管理。

UML

在这里插入图片描述
在这里插入图片描述

由于代码比较多我就不粘贴了,详情见github

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

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

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

相关文章

智跃人力资源管理系统 SQL注入漏洞复现

0x01 产品简介 智跃人力资源管理系统是基于B/S网页端广域网平台&#xff0c;一套考勤系统即可对全国各地多个分公司进行统一管控&#xff0c;成本更低。信息共享更快。跨平台&#xff0c;跨电子设备 0x02 漏洞概述 智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在…

基于单片机的排队叫号系统设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个节日彩灯门&#xff0c;设计的系统实用性强、操作简单&#xff0c;实现了智能化、数字化。 基本要求&#xff1a;利用单片机AT89C51设计排队叫号机&#xff0c;能实现叫号功能。 创新&#xff1a;能显示叫号…

【Redis】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

目录 Redis的慢查询 慢查询配置 慢查询操作命令 慢查询建议 Pipeline 事务 Redis的事务原理 Redis的watch命令 Pipeline和事务的区别 Lua Lua入门 安装Lua Lua基本语法 注释 标示符 关键词 全局变量 Lua中的数据类型 Lua 中的函数 Lua 变量 Lua中的控制语句…

Ubuntu22.04 使用Docker部署Neo4j出错 Exited(70)

项目场景&#xff1a; 最近需要使用Neo4j图数据库&#xff0c;因此打算使用docker部署 环境使用WSL Ubuntu22.04 问题描述 拉下最新Neo4j镜像&#xff0c;执行命令部署 启动容器脚本 docker run -d -p 7474:7474 -p 7687:7687 \ --name neo4j \ --env "NEO4J_AUTHneo…

【Web】NewStarCTF Week4 个人复现

目录 ①逃 ②More Fast ③midsql ④InjectMe ⑤PharOne ⑥flask disk ①逃 一眼字符串逃逸 bad 替换为 good 字符增加一位 先构造一下试试 <?php class GetFlag {public $key;public $cmd "ls /";} $a new GetFlag(); echo serialize($a); 得到O:7:…

redis相关题

1 什么是Redis Redis(Remote Dictionary Server) 是⼀个使⽤ C 语⾔编写的&#xff0c;开源的&#xff08;BSD许可&#xff09;⾼性能⾮关系型&#xff08;NoSQL&#xff09;的键值对数据库。Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串&#xff0c;…

亚马逊云科技:探索未来云计算之窗

云计算技术已经成为现代科技领域中至关重要的一个环节&#xff0c;它为各种行业提供了高效、灵活、可扩展的计算和数据存储解决方案。而在这个领域中&#xff0c;亚马逊云科技&#xff08;Amazon Web Services&#xff0c;AWS&#xff09;以其卓越的技术创新和广泛的云服务覆盖…

“阿里巴巴接口:打造高效电商解决方案的秘密武器”

阿里巴巴接口技术贴 一、概述 阿里巴巴接口是阿里巴巴集团提供的一套开放API接口&#xff0c;旨在为开发者提供与阿里巴巴生态系统进行数据交互的能力。通过使用阿里巴巴接口&#xff0c;开发者可以快速构建与阿里巴巴平台无缝集成的应用程序&#xff0c;提高开发效率和用户体…

zabbix配置snmp trap--使用snmptrapd和Bash接收器(图文教程)

1.前言 我的zabbix的版本是5.0版本&#xff0c;5.0的官方文档没有使用bash接收器的示例&#xff0c;6.0的官方文档有使用bash接收器的示例&#xff0c;但是&#xff0c;下载文件的链接失效&#xff1f;&#xff01; 这里讲解zabbix-server端配置和zabbix web端配置 2.zabbix-…

人工智能的技术研究与安全问题的深入讨论

人工智能&#xff08;AI&#xff09;作为当今世界技术领域的热门话题&#xff0c;吸引了广泛的关注和研究。本文将探讨人工智能技术的最新研究进展&#xff0c;并着重讨论与人工智能安全相关的问题。 引言 人工智能技术的迅速发展为我们的生活带来了翻天覆地的变化。随着科技的…

计网Lesson5 - MAC 地址与 ARP

文章目录 M A C MAC MAC 地址1. M A C MAC MAC 地址的格式 2. M A C MAC MAC 地址的获取3. A R P ARP ARP 协议4. A R P ARP ARP 缓存5. R A R P RARP RARP M A C MAC MAC 地址 1. M A C MAC MAC 地址的格式 每个网卡都有一个 6 6 6 字节的 M A C MAC MAC 地址 M A C…

【模电】基本共射放大电路的组成及各元件的作用

基本共射放大电路的组成及各元件的作用 下图所示为基本共射放大电路&#xff0c;晶体管是起放大作用的核心元件。输入信号 U ˉ i Ū\tiny i Uˉi 为正弦波电压。   当 u i 0 {u\tiny i}0 ui0时&#xff0c;称放大电路处于静态。在输入回路中&#xff0c;基极电源 V B B V\t…

【稳定检索|投稿优惠】2024年经济管理与安全科学国际学术会议(EMSSIC 2024)

2024年经济管理与安全科学国际学术会议(EMSSIC 2024) 2024 International Conference on Economic Management and Security Sciences(EMSSIC 2024) 一、【会议简介】 2024年经济管理与安全科学国际学术会议(EMSSIC 2024)&#xff0c;将于繁华的上海城召开。这次会议的主题是“…

STM32F407-14.3.7-01PWM输入模式

PWM 输入模式 此模式是输入捕获模式的一个特例。其实现步骤与输入捕获模式基本相同&#xff0c;仅存在以下不同之处&#xff1a; 例如&#xff0c;可通过以下步骤对应用于 TI1① 的 PWM 的周期&#xff08;位于 TIMx_CCR1⑨ 寄存器中&#xff09;和占空 比&#xff08;位于 …

替代升级虚拟化 | ZStack Cloud云平台助力中节能镇江公司核心业务上云

数字经济正加速推动各行各业的高质量升级发展&#xff0c;云计算是数字经济的核心底层基础设施。作为云基础软件企业&#xff0c;云轴科技ZStack 坚持自主创新&#xff0c;自研架构&#xff0c;产品矩阵可全面覆盖数据中心云基础设施&#xff0c;针对虚拟化资源实现纳管、替代和…

【服务部署】常用内网穿透方案

一、前言 由于一些开发及使用需求&#xff0c;需要将内网机器端口映射到公网&#xff0c;达到公网访问内网环境的目的 本文主要介绍几种常用的内网穿透方案 ssh远程端口转发 部署简单&#xff0c;无需额外安装软件包 frp反向代理 功能配置丰富&#xff0c;部署相对复杂&#…

git 出现 failed to push some refs to ‘xxx‘

初始化仓库 推送代码 git push -u origin “master” git 出现 failed to push some refs to ‘xxx’ 错误 出错截图&#xff1a; 原因&#xff1a; 本地init创建的仓库&#xff0c;主分支叫main&#xff0c;而这里推的分支是 master 刚刚初始化的仓库没有 main分支 所以推不上…

【散列函数的构造方法(直接定址法 ==除留余数法==),散列表的查找(1.开放地址法,2.链地址法(拉链法))】

文章目录 散列函数的构造方法直接定址法除留余数法 散列表的查找1.开放地址法线性探测法二次探测法伪随机探测法 2.链地址法&#xff08;拉链法&#xff09; 散列表的查找效率 散列函数的构造方法 散列存储 选取某个函数&#xff0c;依该函数按关键字计算元素的存储位置。 Loc…

IntelliJ IDEA安装使用教程

IntelliJ IDEA是一个流行的Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它是一款全功能的IDE&#xff0c;支持多种编程语言&#xff0c;如Java、Kotlin、Groovy、Scala、Python、JavaScript、HTML、CSS等等。IntelliJ IDEA 提供了高效的代码…

智慧垃圾分拣站:科技改变城市环境,创造更美好的未来

随着城市化进程的不断加快&#xff0c;垃圾处理问题日益凸显。为了更好地解决垃圾分类问题&#xff0c;越来越多的城市开始推广智慧垃圾分拣站&#xff0c;利用创新科技实现高效垃圾分类处理。 山海鲸使用三维建模技术&#xff0c;建立了一个智慧垃圾分拣站数字孪生模型&#x…