
itstack-demo-design原型模式题库浅拷贝与深拷贝2个实例帮你避开共享引用大坑【免费下载链接】itstack-demo-design:art: 《重学Java设计模式》是一本互联网真实案例实践书籍。以落地解决方案为核心从实际业务中抽离出交易、营销、秒杀、中间件、源码等22个真实场景来学习设计模式的运用。欢迎关注小傅哥微信(fustack)公众号bugstack虫洞栈博客https://bugstack.cn项目地址: https://gitcode.com/fuzhengwei/itstack-demo-design在 itstack-demo-design《重学Java设计模式》开源项目中这篇文章用一套考试题库的真实场景讲透原型模式的核心为什么浅拷贝会踩进共享引用的坑以及深拷贝如何通过clone()为每位考生生成一份完全独立的试卷。两个可运行的小实例10分钟帮你建立对Java对象复制的完整认知。 为什么需要原型模式想象一个在线考试系统题库固定5道选择题 4道解答题但每位考生都需要一份自己的试卷独立的考生姓名和考号题目顺序打乱选择题选项顺序打乱防止对答案。每次从零创建一套题又贵又冗余原型模式Prototype的思路是先有一个题库模板考试时直接复制一份原型对象再在副本上加工。它本质上就是用已有对象生产新对象比反复 new 更简洁高效。⚠️ 实例一浅拷贝——ArrayList.clone() 与共享引用陷阱首先看 itstack-demo-design-4-00 模块里的两个题目实体解答题AnswerQuestion.java选择题ChoiceQuestion.java作者在 ApiTest.java 中先用ArrayList.clone()做了一次浅拷贝实验复制出的新列表和原列表在结构上是隔离的——一方 add/remove 元素另一方毫发无伤。但浅拷贝有个关键盲区列表里装的对象仍是同一份引用。如果元素本身是可变对象比如带选项 Map 的选择题你在副本上改元素原列表跟着变。这正是 itstack-demo-design-4-01 暴露的隐患在 QuestionBankController.java 中所有考生的选择题共用同一组map01map05选项对象——所有试卷都指着同一份选项。此时只要给某位考生打乱选项其他所有考生的卷子都会跟着乱套这就是典型的共享引用大坑。️ 实例二深拷贝——QuestionBank 的 clone() 实现itstack-demo-design-4-02 模块给出了标准解法。QuestionBank.java 的核心就四步让QuestionBank implements Cloneablesuper.clone()复制外层对象考生、考号等属性对两个题目列表分别再clone()切断列表层面的共享用Collections.shuffle()打乱题目顺序再用 TopicRandomUtil.java 打乱选项——注意它是生成一个全新的 MapTopic.java整体替换而不是原地修改从根上避免污染共享引用。改造后出卷逻辑只剩一行见 QuestionBankController.javaQuestionBank clone (QuestionBank) questionBank.clone();运行测试 ApiTest.java 会连续为三位考生出卷题目、选项、答案顺序各不相同且互不干扰——原题库始终原封不动这就是深拷贝的价值。✅ 浅拷贝 vs 深拷贝速查表对比维度浅拷贝深拷贝外层对象✅ 复制✅ 复制内部引用元素❌ 共享同一引用✅ 递归重建修改副本⚠️ 改元素会污染原件✅ 完全隔离典型写法直接list.clone()重写clone()逐层复制适用场景元素不可变如 String题库这类可变集合 快速上手本地运行这套 Demo 非常简单git clone https://gitcode.com/fuzhengwei/itstack-demo-design cd itstack-demo-design/itstack-demo-design-4-02 mvn test跑通后建议再回头看一眼 4-00 和 4-01 的模块对比没做深拷贝和做了深拷贝的代码差异共享引用的坑自然就记住了。 小结原型模式的精髓一句话复制模板、隔离加工。浅拷贝只复制了外壳内部引用仍然共享是对象污染的重灾区深拷贝则逐层重建对象让每个副本真正独立。题库出卷只是开胃菜订单快照、配置备份、游戏对象克隆等场景都可以用这套思路直接套用。【免费下载链接】itstack-demo-design:art: 《重学Java设计模式》是一本互联网真实案例实践书籍。以落地解决方案为核心从实际业务中抽离出交易、营销、秒杀、中间件、源码等22个真实场景来学习设计模式的运用。欢迎关注小傅哥微信(fustack)公众号bugstack虫洞栈博客https://bugstack.cn项目地址: https://gitcode.com/fuzhengwei/itstack-demo-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考