软件工程学习日志2025.11.3

news/2025/11/3 19:22:34/文章来源:https://www.cnblogs.com/dynastyeast/p/19187998

软件设计模式 - 建造者模式实战
• 实验来源:石家庄铁道大学信息学院实验5

• 实验类型:模仿型实验

• 核心目标:深入理解建造者模式的原理并掌握实际应用

🔍 建造者模式核心理解

模式动机

建造者模式的核心价值在于将复杂对象的构建过程与其表示分离。在计算机组装这个典型案例中:
• 复杂对象:计算机(包含CPU、内存、硬盘、主机等多个部件)

• 稳定过程:组装流程固定(安装CPU→内存→硬盘→主机)

• 不同表示:最终产品可以是笔记本或台式机等不同形态

模式优势

  1. 构建过程封装:指挥者统一管理组装流程
  2. 产品表示灵活:相同构建过程可产生不同产品
  3. 符合开闭原则:新增计算机类型只需添加新建造者

🏗️ 系统类图设计

classDiagram
class Computer {
-String cpu
-String memory
-String hardDisk
-String mainFrame
+setCPU(String cpu)
+setMemory(String memory)
+setHardDisk(String hardDisk)
+setMainFrame(String mainFrame)
+show()
}

class ComputerBuilder {<<abstract>>#Computer computer+buildComputer() void+buildCPU() void+buildMemory() void+buildHardDisk() void+buildMainFrame() void+getComputer() Computer
}class LaptopBuilder {+buildCPU() void+buildMemory() void+buildHardDisk() void+buildMainFrame() void
}class DesktopBuilder {+buildCPU() void+buildMemory() void+buildHardDisk() void+buildMainFrame() void
}class Director {-ComputerBuilder builder+setBuilder(ComputerBuilder builder)+construct() Computer
}ComputerBuilder <|-- LaptopBuilder
ComputerBuilder <|-- DesktopBuilder
ComputerBuilder o--> Computer
Director o--> ComputerBuilder

💻 核心代码实现

  1. 产品类 - 计算机实体

/**

  • 计算机产品类 - 代表被构建的复杂对象
    */
    public class Computer {
    private String cpu;
    private String memory;
    private String hardDisk;
    private String mainFrame;

    // Setter方法
    public void setCPU(String cpu) { this.cpu = cpu; }
    public void setMemory(String memory) { this.memory = memory; }
    public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; }
    public void setMainFrame(String mainFrame) { this.mainFrame = mainFrame; }

    /**

    • 展示电脑配置信息
      */
      public void show() {
      System.out.println("====== 电脑配置信息 ");
      System.out.println("主机:" + mainFrame);
      System.out.println("CPU:" + cpu);
      System.out.println("内存:" + memory);
      System.out.println("硬盘:" + hardDisk);
      System.out.println("
      ===================");
      }
      }
  1. 抽象建造者 - 定义构建接口

/**

  • 抽象建造者 - 定义计算机组装的通用接口
    */
    public abstract class ComputerBuilder {
    protected Computer computer;

    public Computer getComputer() {
    return computer;
    }

    /**

    • 创建计算机实例
      */
      public void buildNewComputer() {
      computer = new Computer();
      }

    // 抽象构建方法
    public abstract void buildMainFrame();
    public abstract void buildCPU();
    public abstract void buildMemory();
    public abstract void buildHardDisk();
    }

  1. 具体建造者 - 笔记本构建器

/**

  • 具体建造者 - 笔记本电脑组装实现
    */
    public class LaptopBuilder extends ComputerBuilder {

    @Override
    public void buildMainFrame() {
    computer.setMainFrame("联想轻薄本专用主板");
    System.out.println("安装笔记本主板...");
    }

    @Override
    public void buildCPU() {
    computer.setCPU("Intel Core i7-1260P 移动版");
    System.out.println("安装笔记本CPU...");
    }

    @Override
    public void buildMemory() {
    computer.setMemory("16GB LPDDR5 4800MHz");
    System.out.println("安装笔记本内存...");
    }

    @Override
    public void buildHardDisk() {
    computer.setHardDisk("1TB NVMe SSD");
    System.out.println("安装笔记本硬盘...");
    }
    }

  1. 具体建造者 - 台式机构建器

/**

  • 具体建造者 - 台式电脑组装实现
    */
    public class DesktopBuilder extends ComputerBuilder {

    @Override
    public void buildMainFrame() {
    computer.setMainFrame("华硕TUF GAMING ATX大板");
    System.out.println("安装台式机主板...");
    }

    @Override
    public void buildCPU() {
    computer.setCPU("AMD Ryzen 7 7700X");
    System.out.println("安装台式机CPU...");
    }

    @Override
    public void buildMemory() {
    computer.setMemory("32GB DDR5 5200MHz");
    System.out.println("安装台式机内存...");
    }

    @Override
    public void buildHardDisk() {
    computer.setHardDisk("2TB SSD + 4TB HDD");
    System.out.println("安装台式机硬盘...");
    }
    }

  1. 指挥者 - 控制构建流程

/**

  • 指挥者 - 控制计算机的组装流程
    */
    public class Director {
    private ComputerBuilder builder;

    public void setBuilder(ComputerBuilder builder) {
    this.builder = builder;
    }

    /**

    • 构建计算机的稳定流程
      */
      public Computer construct() {
      System.out.println("开始组装计算机...");

      builder.buildNewComputer(); // 步骤1:创建新计算机
      builder.buildMainFrame(); // 步骤2:安装主机
      builder.buildCPU(); // 步骤3:安装CPU
      builder.buildMemory(); // 步骤4:安装内存
      builder.buildHardDisk(); // 步骤5:安装硬盘

      System.out.println("计算机组装完成!");
      return builder.getComputer();
      }
      }

  1. 客户端测试代码

/**

  • 客户端测试类
    */
    public class Client {
    public static void main(String[] args) {
    // 创建指挥者
    Director director = new Director();

     System.out.println("=== 组装笔记本电脑 ===");// 组装笔记本电脑ComputerBuilder laptopBuilder = new LaptopBuilder();director.setBuilder(laptopBuilder);Computer laptop = director.construct();laptop.show();System.out.println("\n=== 组装台式电脑 ===");// 组装台式电脑ComputerBuilder desktopBuilder = new DesktopBuilder();director.setBuilder(desktopBuilder);Computer desktop = director.construct();desktop.show();// 验证两个计算机对象不同System.out.println("两台电脑是否相同: " + (laptop == desktop));
    

    }
    }

🎯 运行结果示例

=== 组装笔记本电脑 ===
开始组装计算机...
安装笔记本主板...
安装笔记本CPU...
安装笔记本内存...
安装笔记本硬盘...
计算机组装完成!
====== 电脑配置信息 ======
主机:联想轻薄本专用主板
CPU:Intel Core i7-1260P 移动版
内存:16GB LPDDR5 4800MHz
硬盘:1TB NVMe SSD

=== 组装台式电脑 ===
开始组装计算机...
安装台式机主板...
安装台式机CPU...
安装台式机内存...
安装台式机硬盘...
计算机组装完成!
====== 电脑配置信息 ======
主机:华硕TUF GAMING ATX大板
CPU:AMD Ryzen 7 7700X
内存:32GB DDR5 5200MHz
硬盘:2TB SSD + 4TB HDD

两台电脑是否相同: false

📝 编程规范实践总结

代码规范要点

  1. 命名规范:类名大驼峰,方法名小驼峰
  2. 访问控制:属性private,建造者引用protected
  3. 注释完整:每个类和方法都有JavaDoc说明
  4. 包结构清晰:相关类组织在合适包中
  5. 格式统一:一致的缩进和代码风格

设计模式最佳实践

  1. 单一职责:每个类职责明确
  2. 依赖倒置:依赖于抽象而非具体实现
  3. 开闭原则:易于扩展新的建造者

💡 学习收获与反思

掌握程度评估

• ✅ 理解了建造者模式的结构和动机

• ✅ 能够绘制标准的UML类图

• ✅ 实现了完整的代码示例

• ✅ 遵循了编程规范要求

实际应用思考

建造者模式不仅适用于计算机组装,在软件开发中还有很多应用场景:
• 文档生成器(HTML、PDF等不同格式)

• 餐饮订单系统(不同套餐组合)

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

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

相关文章

day05-智能换脸-12306出行建议-提取音频工作流

今日内容 1 智能换脸1.1 目标 # 1 用户上传两张人像,把其中一张人脸换到另一个人脸上----》Coze工作流-工作流、智能体---》使用代码调用---》借助于api-python代码、java,go。。。。-postman调用-后期做成软件-app,…

x./AC自动机

前置::trie , kmp AC自动机 #include <bits/stdc++.h> using namespace std; typedef long long ll;const int MAXN = 2e5 + 5; // 模式串长度之和int tr[MAXN][26], fail[MAXN], tot = 0; int e[MAXN], sum[M…

P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题

最大公约数(即 gcd)和最小公倍数(即 lcm)的求法。该题的关键点在于,两个数的积等于它们最大公约数和它们最小公倍数的积。公式表示为 \(a \times b = \text{gcd}(a,b) \times \text{lcm}(a,b)\)。设作为答案的两个…

SQL Server 并发控制 第四篇:Snapshot Isolation (SI) 和 Read Committed Snapshot Isolation (RCSI)

乐观控制模式假定阻塞很少,快照隔离通过使用行版本控制来避免大多数锁定和阻塞。当数据被修改时,受影响行的已提交版本会被复制到 tempdb 并赋予版本号,此操作称为写时复制 (Copy on Write),并用于所有的插入、更新…

godot 描边插件

1:https://github.com/Magodra/GlowBorderEffect 2: outline.gdshader 不支持半透明:shader_type spatial; render_mode unshaded;/*Normal/Depth outline shader. Apply to nodes as a next pass shader texture.In…

对递归两层含义的理解

对递归两层含义的理解目录背景知识Definition从堆栈的角度理解递归缺点和For循环的区别总结Reference背景知识 先了解一下内存结构,但这个不是必须的。Definition 递归是一个循环结构,主要用来处理需要循环执行的任务…

怎么在现有App里融入AI对话能力

怎么在现有App里融入AI对话能力在数字化交互日益重要的今天,用户对App的智能化期望越来越高。尤其是在社交、电商、客服等领域,AI对话能力不仅能显著提升用户体验,还能有效降低运营成本。 但对于大多数开发团队而言…

DFS 序 O(1) 求 LCA

抛弃欧拉序,拥抱DFN。更新日志 2025/11/03:开工。思路 查询 \((dfn_u,dfn_v]\) 最小深度的节点的父亲即可。读者自证不难。

@pytest.fixture和setup/teardown

一.定义fixture 定义:@pytest.fixture是 Pytest 中用于定义​​测试夹具(Fixture)​​的核心装饰器,其核心作用是​​为测试用例提供可复用的资源初始化、数据准备和清理逻辑​​ 二:代替setup 和 teardownsetup =…

矿山通信如何实现全域一体化?迈威为煤矿装上了“智慧神经网络”

矿山通信如何实现全域一体化?迈威为煤矿装上了“智慧神经网络”在刚刚落幕的第二十一届中国国际煤炭采矿技术展上,全球矿业的目光再次聚焦于一个核心议题:数字化转型如何真正在矿山落地。作为这一进程的“神经中枢”…

Java异常处理实战精要:构建稳定应用的基石

在Java项目的开发历程中,异常处理是衡量代码健壮性与开发者专业度的重要标尺。一个处理得当的异常体系,能像程序的免疫系统一样,有效抵御外部的意外干扰,维持内部逻辑的稳定运行。本文将系统性地梳理Java项目中异常…

€$P2025

省流:唇膜玩 由于特殊原因把前面部分跳过 刚进考场被监考员扔到没人坐的一组的第一排,然后我的右边的右边的后面是小玉米 14:27 准时看 T1,这个 \(\frac{n}{2}\) 的限制导致最多只有一个部门会因为限制导致结果变小…

CSP2025 补题

游记没什么好搬的,链接。 T1 发现只会有一个超限,贪心换一下就行了。 T2 首先暴力枚举 \(k\) 拿边跑 MST 的复杂度是 \(O(2^knk + 2^kn\log nk)\) 的,考虑将 Kruskal 的 sort 换成 std::merge 即可通过,复杂度 \(O…

哈希学习总结

基本思想 哈希的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。 性质两个相同的元素哈希值相同。 两个不同的元素哈希值不同(若相同则称为冲突)。一维哈希(字符串哈希) 对于字符串 \(s\),其哈希值…

142.环形链表 II

var detectCycle = function(head) {if(!head)return null;let pre=head,cur=head;while(cur&&cur.next){pre=pre.next;cur=cur.next.next;if(pre===cur){let temp=head;while(temp!==pre){pre=pre.next;temp=…

2025 年 11 月制冷设备厂家推荐排行榜,小型制冷设备,空调制冷设备,工业制冷设备,商用制冷设备,大型制冷设备,制冷设备安装与维修服务公司推荐

2025 年 11 月制冷设备厂家推荐排行榜:小型、空调、工业、商用及大型制冷设备综合指南 行业背景与发展趋势 制冷设备行业作为现代工业和商业基础设施的重要组成部分,正经历着技术革新和市场需求的深刻变革。随着节能…

从创作到分析全搞定!2025公众号效率工具深度测评,这波升级95%的人还不知道

从创作到分析全搞定!2025公众号效率工具深度测评,这波升级95%的人还不知道作为新媒体运营者,你是否常陷入这些困境:熬夜赶稿后排版格式反复出错,跨平台分发时样式全乱;拟标题时反复修改仍无爆款潜力,配图怕侵权…

20232304 2025-2026-1 《网络与系统攻防技术》实验四实验报告

20232304 2025-2026-1 《网络与系统攻防技术》实验四实验报告 1.实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者…

k8s-java应用部署(4)

我们一个常见的应用,一般都会涉及到访问数据库,配置等外部资源。同时也将自己的能力提供给外部访问,前面已经介绍pod的内外网络通信 k8s-Pod中的网络通信(3) 这次直接做一个java应用, 开发——打镜像——配置并部署…

指数函数和对数函数

一、指数函数的定义与特点:指数函数的一般形式为f(x) = a^x,其中a为常数,x为自变量。它以自然常数e为底,也可以选择其他正实数作为底。指数函数的特点如下:1. 当a>1时,随着x的增大,指数函数迅速增大,呈现指…