创建型 原型模式

简介: 原型模式通过复制现有对象(原型)创建新实例,适用于创建成本高、差异小的场景。分浅拷贝(仅复制基本类型和引用地址,共享对象)与深拷贝(完全独立副本,递归或序列化实现),二者核心区别在于堆内存中是否生成新对象。(239字)

原型模式的两种实现方式:深拷贝和浅拷贝
原型模式的原理与应用
如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。
原型模式的两种实现方法
原型模式有两种实现方法,深拷贝和浅拷贝。
浅拷贝只会复制对象中基本数据类型数据和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象……而深拷贝得到的是一份完完全全独立的对象。所以,深拷贝比起浅拷贝来说,更加耗时,更加耗内存空间。如果要拷贝的对象是不可变对象,浅拷贝共享不可变对象是没问题的,但对于可变对象来说,浅拷贝得到的对象和原始对象会共享部分数据,就有可能出现数据被修改的风险,也就变得复杂多了。

浅拷贝:浅拷贝的实质定义:只拷贝基本数据类型和引用类型的地址,不拷贝引用对象本身,不会在堆内存中重新创建对象。
Object 类的 clone() 方法执行的是浅拷贝。它只会拷贝对象中的基本数据类型的数据(比如,int、long),以及引用对象(SearchWord)的内存地址,不会递归地拷贝引用对象本身。
image.png

深拷贝:实现方式有两种,
第一种方法:递归拷贝对象、对象的引用对象以及引用对象的引用对象……直到要拷贝的对象只包含基本数据类型数据,没有引用对象为止。
第二种方法:先将对象序列化,然后再反序列化成新的对象。
image.png

浅拷贝和深拷贝:关键看引用的物理地址有没有发生变化,如果没有变化则是浅拷贝,发生变化就是深拷贝,也就是看这个拷贝有没有在堆中创建出来对象,没有创建新的对象,只是创建了一个对象引用则是浅拷贝,如果在堆中创建出了新的对象,则是深拷贝。
//map中的value存的是对象的引用,也就是一个物理地址
HashMap copyMap = new HashMap<>();
copyMap.put(1001, new Person("li"));
copyMap.put(1002, new Person("wang"));

//object的clone都是浅拷贝,浅拷贝只会拷贝基本数据类型和对象的引用,新集合中的value跟
//老集合中的value是相同的,指向同一个内存对象,所以此时更改Person对象中的内容,两边都会更改
HashMap<Integer, Person> lightCopy = (HashMap<Integer, Person>) copyMap.clone();

//深拷贝  实现方式 先将对象序列化,然后再反序列化成新的对象。
try {
    HashMap<Integer, Person> deepCopyMap = (HashMap<Integer, Person>) deepCopy(copyMap);
} catch (Exception e) {
    e.printStackTrace();
}

public Object deepCopy(Object object) {
Object copyObject = null;
try {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(object);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
object = oi.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return copyObject;
}

相关文章
|
2月前
|
XML JSON 数据格式
创建型 工厂模式
工厂模式包含三种变体:简单工厂(集中创建,适合逻辑简单场景)、工厂方法(抽象工厂接口+多实现类,符合开闭原则,应对复杂创建逻辑)和抽象工厂(统一创建多个关联对象,适用于产品族场景)。三者均用于封装对象创建过程,提升复用性与可维护性。(239字)
100 1
|
2月前
|
设计模式
|
2月前
|
人工智能 边缘计算 自然语言处理
2026实测AI办公平台综合使用观察指南
本文为2026年AI办公平台实测指南,聚焦日常办公真实痛点,系统分析会议纪要、批量文案、任务协同、知识沉淀、数据可视化五大提效场景;对比云端协同、轻量工具、本地部署等五类平台差异,并按管理者、HR、销售等岗位给出适配建议,强调AI辅助而非替代人工,倡导渐进式落地。(239字)
|
2月前
|
Web App开发 数据采集 JSON
Coding工具搜索不够全?我做个 deuseek:一条命令补齐全网搜索
deuseek 是专为国产大模型(如GLM-5.2、Kimi3)Agent设计的CLI工具,填补其联网搜索短板。支持多源检索(HN、B站、微信公众号等)+ 全文抓取(Markdown结构化),含三层智能抓取引擎与DomainKB缓存,兼顾速度与反爬穿透能力,助力Agent真正自主查资料。
|
2月前
|
人工智能 JSON 自然语言处理
制造业官网为何不被AI采信:GEO项目拆解
该文剖析制造业官网内容“量多却AI不采信”的根源:事实冲突、条件缺失、证据孤立、多语漂移等七大问题,提出以“事实库”替代“页面库”,构建“事实—条件—证据—页面”四层可信知识体系,推动官网从信息堆砌升级为可验证、可追溯、低歧义的工业知识资产。
128 1
|
2月前
|
JSON API 调度
动态代理IP怎么用?3类业务场景的接入配置流程
本文分享代理IP接入的实战经验,对比API提取与隧道入口两种方式,详解选型逻辑、配置要点及三大典型场景(通用采集/APP批量/招投标平台)的优化方案,并总结连通性验证与常见踩坑(如调频过频、鉴权遗漏、超时过短),助开发者半天高效接入,避免重复造轮子。
|
2月前
|
存储 人工智能 搜索推荐
模型没有“记忆力”?一文读懂Agent记忆模块的四大类型与主流框架
本文详解AI智能体“记忆模块”:破解LLM“金鱼脑”困境,系统梳理工作、语义、情境、程序性四大记忆类型,解析检索-注入-执行-写入闭环,并对比Mem0、Letta、Zep、LangMem四大主流框架,助你构建真正懂用户、记得住、可进化的AI助手。
297 1
模型没有“记忆力”?一文读懂Agent记忆模块的四大类型与主流框架
|
2月前
|
人工智能 测试技术 API
最新版阿里云百炼 Coding Plan (整合千问、GLM、Kimi 、MiniMax顶级模型,兼容主流AI编程工具)功能介绍
阿里云百炼Coding Plan是专为开发者打造的AI编程专属订阅服务,采用固定月费模式,整合通义千问、GLM、Kimi、MiniMax等顶级大模型,兼容Qwen Code、OpenClaw、Claude Code等主流AI编程工具,以请求次数为统一计量标准,提供专属推理通道与稳定调用额度,彻底解决按量计费的成本失控问题,成为个人开发者高效、低成本接入AI编程能力的首选方案。该服务专为交互式编程场景设计,支持全栈代码生成、项目重构、调试优化、文档生成等开发全流程,通过一套API Key打通多模型与多工具,实现“一次配置、全场景可用”,大幅提升开发效率与体验。
631 0
|
2月前
|
人工智能 缓存 自然语言处理
阿里云百炼Token Plan新增个人版:39元1个月,个人版和团队版有啥区别?选哪个?
阿里云百炼Token Plan新增个人版,最低39元/月,含Lite/Standard/Pro三档;企业版分标准/高级/尊享席位,最低150元/席位/月。统一按Credits计费,支持Qwen3.8-Max-preview等多模态模型及主流AI工具,夜间调用低至2折。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
417 0
|
2月前
|
人工智能 运维 安全