原型模式
解释:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新对象。
其实就是从一个对象再创建另外一个可定制的对象,且不需知道任何创建的细节。
优点:
防止多次实例化同样的东西,并设置同样的属性。类似克隆。
对性能提高较大。一般在初始化信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
等于不用重新初始化对象,而是动态地获得对象运行时的状态。
注意:
MemberwiseClone()是浅表复制,对于值类型没什么问题。但是对于引用类型,还是指向了原来的对象。所以修改后会影响克隆之前引用对象的值。
代码示例:
升级版本:
对于.NET而言,原型抽象类prototype用不着,因为克隆太常用了。所以,.NET在System命名空间中提供了ICloneable接口,其中有方法Clone()。这样,目标类只需要实现这个接口就可以完成原型模式了。
代码示例:
浅复制:
被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。(引用对象克隆的与原始的都指向同一个引用)
简历类的Clone():
客户端代码:
结果:
深复制:
把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。(引用对象克隆的与原始的指向不同的引用)
数据集对象DataSet,Clone()方法用来复制DataSet的结构,但不复制DataSet的数据,实现了原型模式的浅复制。Copy()方法不但复制结构,也复制数据,实现了原型模式的深复制。
简历类的Clone():
简历类的初始化:
工作经历的Clone():
结果:
深复制要深入到多少层,需要事先考虑好,而且要当心出现循环引用的问题,需要小心处理。此例只深入到第一层。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?