史上最全设计模式——原型模式
2019独角兽企业重金招聘Python工程师标准>>>
参考:
1、史上最全设计模式
2、https://www.cnblogs.com/zhangtianq/p/6006120.html
所谓的原型模式就是就是克隆模式,把原有的对象克隆出一个新的对象,这里克隆有浅克隆和深克隆之分。
浅克隆对于目录对象中的引用类型(比如其它以对象实例、集合等)为共用,改变其中一个都会影响所有克隆出来的对象。
如下图:
原型设计模式结构图如下:
具备原型模式的类所有实现原型类的clone方法,对java来说,Object对象中已有clone方法,子类覆盖即可,同时实现cloneable标识接口。
package com.ztq.prototype;import java.util.Date;//浅克隆
@Data
public class Sheep implements Cloneable{private String sname;private Date birthday;@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone(); //直接调用Object对象的clone()方法return obj;}
}
上面的浅克隆方法,改变birthday将影响所有克隆出来的对象。
下面是深克隆:
@Override
protected Object clone() throws CloneNotSupportedException {Object obj = super.clone(); //直接调用Object对象的clone()方法//添加如下代码实现深复制Sheep s = (Sheep)obj;s.birthday = (Date)this.birthday.clone();return obj;
}
上面的方式缺点就是如果有太多的引用成员会写很多上面类似的代码,所以更好的方式是使用下面的方式实现深克隆。(采用对象序列化的方式,这里需要注意,序列化的对象需要实现 Serializable 标识接口)
@Override
protected Object clone() throws CloneNotSupportedException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(s1);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return ois.readObject(); //克隆好的对象
}
转载于:https://my.oschina.net/u/915967/blog/1648092
史上最全设计模式——原型模式相关推荐
- 史上最全设计模式导学目录(完整版)
圣诞献礼! 2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多篇与设计模式学习相关的文章,涵盖了七个面向对象设计原则和24个设计模式(23个GoF设计模式 + 简单工厂模式), ...
- 硬核!史上最全的工厂模式文章,从零到一全面讲解!
文章首发于「陈树义」公众号及个人博客 shuyi.tech,欢迎访问更多有趣有价值的文章. 工厂模式是编程中用得最多的设计模式.本文由一个简单的生活例子触发,从工厂方法模式到简单工厂模式,再到多工厂模 ...
- [收藏]可能是史上最全免费编程书籍
目录 语言无关 IDE MySQL NoSQL PostgreSQL Web WEB服务器 其它 函数式概念 分布式系统 在线教育 大数据 操作系统 数据库 智能系统 正则表达式 版本控制 程序员杂谈 ...
- 史上最全的软件工程师资料收集
目录 语言无关 IDE MySQL NoSQL PostgreSQL Web WEB服务器 其它 函数式概念 分布式系统 在线教育 大数据 操作系统 数据库 智能系统 正则表达式 版本控制 程序员杂谈 ...
- 史上最全的iOS面试题及答案
史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...
- 2019史上最全java面试题题库大全800题含答案
2019史上最全java面试题题库大全800题含答案 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中的自动装配有 ...
- 2019史上最全java面试题题库大全800题含答案(面试宝典)
2019史上最全java面试题题库大全800题含答案(面试宝典) 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中 ...
- 2022史上最全java面试题题库大全800题含答案
2022史上最全java面试题题库大全800题含答案 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中的自动装配有 ...
- 2023史上最全Java面试题【完整版】跳槽必备,看完轻松收撕面试官
✨作者简介:杨 戬,博客专家.github开源作者 ✨多年工作总结:Java学习路线总结,小白逆袭Java技术总监 ✨技术交流:定期更新Java硬核干货,不定期送书活动.助你实现技术飞跃 ✨关注公众号 ...
最新文章
- 选错导师误终身?Nature大调查显示 :全球1/4博士生想换导师
- c语言case的应用,switch、case的使用
- 怪事,硬盘上的FC3_cd1的ISO莫名其妙被改变了
- JAVA将ResultSet结果集遍历到List中
- 菜鸟linux的sed,Linux sed命令菜鸟入门
- Failed to find Build Tools revision 26.0.1
- C语言手写二叉树(链式存储结构)
- 百分点发布《数据决策力白皮书》:数据的能量才开始激发
- 复习:稀疏链表的十字链表
- [数据结构与算法]RED-BLACK(红黑)树的实现TreeMap源码阅读
- Python+OpenCV:OpenCV-Python绑定是如何工作的?
- JSK-337 汽水瓶【数学+模拟】
- 解决办法:E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)
- 简易而又灵活的Javascript拖拽框架(三)
- 阿里钉钉向1000万企业组织免费开放在家办公系统
- 微信小程序之摇骰子源代码分享
- tlwdr5660间歇性掉线_tl-wdr7660无线掉线?tl-wdr7660路由不稳定怎么办?
- 电脑键盘部分按键失灵_笔记本电脑部分按键失灵,可能的原因有哪些?
- 2022年工作日节假日数据
- 什么是OLAP?主流八大开源OLAP技术架构对比