软件工程学习日志2025.11.17

news/2025/11/17 21:27:53/文章来源:https://www.cnblogs.com/dynastyeast/p/19234458

今天的学习重点是设计模式中的享元模式,结合“围棋软件”的实验需求,完成了从需求分析、代码实现到类图绘制的全流程。过程中在Mermaid类图生成上踩了不少坑,最终摸索出兼容且逻辑正确的方案,特此记录整个过程,方便后续回顾。
一、实验需求拆解
本次实验要求设计一款围棋软件,核心约束是:系统中仅存在一个白棋对象和一个黑棋对象,却能在棋盘不同位置重复显示。同时需满足:

  1. 用享元模式实现对象复用(核心);
  2. 享元工厂类需结合单例模式和简单工厂模式;
  3. 提交完整的类图和源代码;
  4. 遵循编程规范。
    核心设计思路
  • 享元模式核心:区分“内部状态”(可共享,如棋子颜色)和“外部状态”(不可共享,如棋子位置);
  • 内部状态:黑棋/白棋的颜色,仅需各创建一个实例;
  • 外部状态:棋子在棋盘的坐标,通过独立类封装,每次显示时动态传入;
  • 工厂类:单例确保全局唯一,简单工厂负责创建和缓存享元对象。
    二、代码实现
  1. 外部状态类:Position(存储棋子坐标)
    public class Position {
    private int x;
    private int y;

    public Position(int x, int y) {
    this.x = x;
    this.y = y;
    }

    public int getX() {
    return x;
    }

    public int getY() {
    return y;
    }
    }

  2. 抽象享元类:Chess(定义棋子行为)
    public abstract class Chess {
    // 内部状态:棋子颜色(可共享)
    protected String color;

    public Chess(String color) {
    this.color = color;
    }

    // 抽象方法:结合外部状态(位置)显示棋子
    public abstract void display(Position pos);
    }

  3. 具体享元类:BlackChess/WhiteChess(实际棋子实例)
    public class BlackChess extends Chess {
    public BlackChess() {
    super("黑色");
    }

    @Override
    public void display(Position pos) {
    System.out.println("[" + color + "棋子] 落在位置:(" + pos.getX() + "," + pos.getY() + ")");
    }
    }

public class WhiteChess extends Chess {
public WhiteChess() {
super("白色");
}

@Override
public void display(Position pos) {System.out.println("[" + color + "棋子] 落在位置:(" + pos.getX() + "," + pos.getY() + ")");
}

}
4. 享元工厂类:ChessFactory(单例+简单工厂)
import java.util.HashMap;
import java.util.Map;

public class ChessFactory {
// 单例模式:饿汉式(线程安全)
private static final ChessFactory instance = new ChessFactory();

// 缓存容器:存储颜色-棋子的映射
private Map<String, Chess> chessMap;// 私有构造:初始化缓存,预创建黑棋和白棋实例
private ChessFactory() {chessMap = new HashMap<>();chessMap.put("black", new BlackChess());chessMap.put("white", new WhiteChess());
}// 获取单例工厂实例
public static ChessFactory getInstance() {return instance;
}// 简单工厂方法:根据颜色获取棋子实例(复用缓存)
public Chess getChess(String color) {String key = color.toLowerCase();if (!"black".equals(key) && !"white".equals(key)) {throw new IllegalArgumentException("仅支持黑色(black)和白色(white)棋子");}return chessMap.get(key);
}

}
5. 测试类:验证效果
public class ChessTest {
public static void main(String[] args) {
// 获取单例工厂
ChessFactory factory = ChessFactory.getInstance();

    // 多次获取黑棋/白棋,验证实例唯一性Chess black1 = factory.getChess("black");Chess black2 = factory.getChess("black");Chess white1 = factory.getChess("white");Chess white2 = factory.getChess("white");System.out.println("黑棋实例是否唯一:" + (black1 == black2)); // trueSystem.out.println("白棋实例是否唯一:" + (white1 == white2)); // true// 显示棋子在不同位置(复用实例,仅传递外部状态)black1.display(new Position(3, 3));black2.display(new Position(5, 5));white1.display(new Position(4, 4));white2.display(new Position(6, 6));
}

}
三、类图绘制:踩坑与最终方案

  1. 初始踩坑经历
    实验要求提交类图,最初尝试用Mermaid绘制时,多次生成失败,问题集中在:
  • 泛型格式不兼容(如Map<String, Chess>改为Map后解决);
  • 抽象类关键字abstract导致解析失败(最终去掉关键字,通过继承关系隐含抽象性);
  • 关系符号错误(曾误将ChessFactoryChess设为继承关系ChessFactory <|-- Chess,实际应为关联关系)。
  1. 类图
    classDiagram
    class Position {
    int x
    int y
    Position(int x, int y)
    getX()
    getY()
    }

    class Chess {
    String color
    Chess(String color)
    display(Position pos)
    }

    class BlackChess {
    BlackChess()
    display(Position pos)
    }

    class WhiteChess {
    WhiteChess()
    display(Position pos)
    }

    class ChessFactory {
    ChessFactory instance
    Map chessMap
    ChessFactory()
    getInstance()
    getChess(String color)
    }

    // 继承关系:具体享元继承抽象享元
    Chess <|-- BlackChess
    Chess <|-- WhiteChess

    // 关联关系:工厂缓存享元对象
    ChessFactory -- Chess

  2. 类图逻辑说明

  • 继承关系:BlackChessWhiteChess继承自Chess,符合享元模式“具体享元实现抽象享元”的结构;
  • 关联关系:ChessFactoryChess通过实线连接,表示工厂持有并缓存棋子实例;
  • 无复杂语法:去掉所有可能引发解析的关键字和标注,确保在任何Mermaid工具中都能生成成功。
    四、生成验证步骤
  1. 打开Mermaid官方在线编辑器(https://mermaid.live);
  2. 粘贴上述类图代码,右侧实时生成可视化类图;
  3. 点击顶部「Export」导出为PNG/JPG格式,即可用于实验提交。
    五、学习总结
  4. 享元模式的核心是“复用对象、分离内外状态”,适用于需要大量重复对象的场景(如围棋、文字处理软件中的字符);
  5. 工厂类结合单例+简单工厂,既能保证全局唯一的创建入口,又能通过缓存实现对象复用;
  6. Mermaid类图绘制需优先使用基础语法,避免过度依赖高级特性,确保兼容性;
  7. 类图的逻辑正确性至关重要,继承(is-a)和关联(has-a)关系不能混淆。

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

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

相关文章

CSP2025 游记 + whk 期中

非常的 fvvJ 用了大概 50 min 把所有题都写了,开始对拍后两题,拍了几万组没啥问题。没检查 T1、T2,开始瞎玩终端(学习了 while、let、declare 的用法)。估分 400。 S T1 卡了我 1 h,后面发现想复杂了。T2 先用 1…

论文速读 | 2025年11月

Object-Centric Latent Action LearningAAAI 2026 dunnolab

2025-11-17

CF Problem - 839C - Codeforces(DFS)(1500)(期望) 求期望dp 即求1的(所有孩子的期望+1)的和,除以孩子数量 #include <bits/stdc++.h> using namespace std; #define LL long long const LL mod = 9982…

九成九新自用C#入门文档

C#九成九新个人用入门指南前言 如果你是第一次学习编程,那么,可能会非常困难,如果你曾经学过面向对象的编程语言,那么可能会非常轻松 C:你干脆直接提我名字得了吧 在我们正式学习之前,我需要讲几个比较基础的知识…

商场展览车生产厂家十大排名及选购推荐,航利通达网红礼盒拖车公司,透明车厢生产厂家,车载展柜公司十大权威排行,商场展览车公司十大排名

商场展览车生产厂家十大排名及选购推荐,航利通达网红礼盒拖车公司,透明车厢生产厂家,车载展柜公司十大权威排行,商场展览车公司十大排名商场展览车生产厂家十大排名及选购推荐,航利通达网红礼盒拖车公司,透明车厢…

Flask+Celery+Blueprint

遇到1个问题:任务写入了broker,但是celery执行任务时包拒绝访问句柄6错误 解决方法:pip install gevent celery -A my_shop.task.tasks worker -l info -P gevent

102302109-胡贝贝-作业3

作业① (1)实验内容及结果 要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。 –务必控制总页数(学号尾数2位)、总下载的图片…

halt linux

在 Linux 系统中,halt 命令用于关机系统。它会立即终止所有正在运行的进程,并将系统状态设置为“关机”状态。 常用用法: sudo halt 或者: sudo poweroff 这两个命令的作用是相同的,但 poweroff 会更优雅地处理系…

hadoop linux 安装

在 Linux 系统上安装 Hadoop 需要以下几个步骤,包括系统准备、下载 Hadoop、解压安装、配置环境变量、启动集群等。以下是一个通用的安装指南,适用于大多数 Linux 发行版(如 Ubuntu、CentOS、Debian 等)。一、系统…

2025最新展柜设计公司推荐,展柜制作公司,展台源头厂家,烤漆展柜十大品牌推荐榜,家纺柜台供应厂家十大排行榜:梵之宇装饰推荐

2025最新展柜设计公司推荐,展柜制作公司,展台源头厂家,烤漆展柜十大品牌推荐榜,家纺柜台供应厂家十大排行榜:梵之宇装饰推荐2025最新展柜设计公司推荐,展柜制作公司,展台源头厂家,烤漆展柜十大品牌推荐榜,家纺…

团队技术资产建设:从散兵游勇到标准化作战

好的,这是一个能充分展现您技术领导力和工程化思维的问题。下面我将为您系统地阐述如何从0到1规划、设计并推动团队技术资产的建设。团队技术资产建设:从散兵游勇到标准化作战 提升100%的开发效率并非一蹴而就,它是…

2025年11月学习机榜单:打破智商税偏见,十大提分机型实证推荐

2025年11月学习机榜单:打破智商税偏见,十大提分机型实证推荐“学习机是智商税” 的偏见,本质是对 “低效工具” 的否定 —— 但 2025 年艾媒咨询数据显示,具备 “精准诊断 - 定向训练 - 效果追踪” 全链路能力的 A…

解决罗技M590右键必须用力才能使用的问题

罗技M590用了好几年了,最近频繁出现右键轻点没有反应的情况,必须用力才能弹出右键菜单,一开始还以为是微动问题,物理方法替换微动弹簧片也没有解决问题,后来发现是因为模具与微动接触的地方磨损出现空行程导致的.那就…

悼念故友

美人离思远,湘水夜来深美人离思远,湘水夜来深 我的生命中曾有一位非常非常重要的人。 我们一起观春花,爬夏树,拾秋叶,赏冬雪。 我们一起上学,一起闯祸,一起FQ翘课,一起登台演出。 我们一起上过道观,进过寺庙,…

UV python管理工具 mac电脑

python3.9为系统自带的 pip3pip 对应的是uv 3.13 系统配置了pip路径 也设置了软连接 所有是pip ls -la /Users/peter/.local/bin/ | grep pip 查看软连接 uv python包管理器 uv python list 查看安装的python uv pyth…

题解:uoj632【UR #21】挑战最大团

题意:给出一个无向图,其满足以下性质:若存在边 \((a,b),(b,c),(c,d)\),则 \((a,c),(a,d),(b,d)\) 不能同时不存在。求图中大小为 \(1,2,3\cdots n\) 的团的个数。\(n\le 8000\)。 做法: 直接做是 npc,考虑发掘性…

[CSP-S 2025] 员工招聘 / employ

P14364 [CSP-S 2025] 员工招聘 / employ 先初步分析一下录取的条件:\(s_i=0\) 此时一定不会被录取 \(s_i=1\) 记之前被淘汰的人数为 \(j\),则若 \(c_{p_i}>j\) 则会被录取,\(c_{p_i}\le j\) 不会被录取。考虑一个…

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

1.实验内容 掌握Metasploit的基础操作:模块搜索(search)、加载(use)、参数配置(set)、攻击执行(exploit/run)及会话管理(sessions)。 理解4类漏洞的核心原理,明确漏洞与靶机开放端口、服务的对应关系。 能…

sequence 题解

原题链接。 首先这个数据范围就很 meet in middle。 首先一个关键性质是对于任意的一个顶到界限的 \(a\) 都能保它顶到界限那一位后面的位数合法,因为它后面随便选就意味着一定能通过调整使得后面的位置异或完是零。 …

2025上海商铺办公室装修公司推荐指南:业态适配与TOP10实力榜

2025上海商铺办公室装修公司推荐指南:业态适配与TOP10实力榜一、商铺装修公司核心评估维度(基于商业空间需求定制) 据《上海市商业空间装饰服务标准(2025 版)》,优质商铺装修服务商需满足六大针对性指标,适配餐…