package basic; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public abstract class PrototypeBasic<T> implements Cloneable, Serializable { /** * */ private static final long serialVersionUID = -5189738655874585053L; @SuppressWarnings("unchecked") public T clone() throws CloneNotSupportedException { return (T)super.clone(); } @SuppressWarnings("unchecked") public T deepClone() throws IOException, ClassNotFoundException { ByteArrayOutputStream bao = new ByteArrayOutputStream(); ObjectOutputStream obs = new ObjectOutputStream(bao); obs.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (T)ois.readObject(); } }
测试代码:
package basic; import java.io.IOException; public class Father extends PrototypeBasic<Father> { /** * */ private static final long serialVersionUID = 860498590845379201L; private int fatherValue; private String desc; private Son son; public Son getSon() { return son; } public void setSon(Son son) { this.son = son; } public int getFatherValue() { return fatherValue; } public void setFatherValue(int fatherValue) { this.fatherValue = fatherValue; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException { Father f = new Father(); f.setFatherValue(4); f.setDesc("desc"); Son son = new Son(); son.setStr("son prototype"); System.out.println("son's hashcode:" + son.hashCode()); f.setSon(son); Father clone = f.clone(); Father deepClone = f.deepClone(); clone.setDesc("desc===clone"); System.out.println(f.getFatherValue() + " " + f.getDesc() + " " + f.getSon()); System.out.println(clone.getFatherValue() + " " + clone.getDesc() + " " + clone.getSon()); System.out.println(deepClone.getFatherValue() + " " + deepClone.getDesc() + " " + deepClone.getSon()); } }
几点说明:
(一) 优点: 如果某个类想实现深浅复制功能,只需要和例子当中的Father类一样,继承抽象类PrototypeBasic,浅复制调用clone()方法,深复制调用deepClone()方法
(二) 缺点: 需要实现复制的类继承PrototypeBasic就不能继承其他类了,以后扩展会受到影响;需要复制类的属性如果有其他类的引用,那么该引用需要实现Cloneable, Serializable接口
代码只是即兴而写,只做了简单的深浅复制测试,不保证其他情况下不出现bug
相关推荐
设计模式专题之(五)原型模式---设计模式原型模式示例代码(python--c++)
JAVA-设计模式-创建型模式-原型模式
原型模式-建造同样的果园 桥接模式-果园实现统一的种植方法 原型模式-建造同样的果园 原型模式-建造同样的果园 适配器模式-果园改变种植方式 原型模式-建造同样的果园 外观模式-种植不同种类的水果
Axure9项目原型案例-原型50-案例20-原件1
ava常用设计模式-原型模式
Axure产品经理原型教程-入门到精通pdf版。详细介绍了Axure的使用,每个控制都有讲,非常细致,是我收集的好书之一,适合产品经理
Java设计模式-原型模式详解
C++设计模式-创建型模式-原型模式;C++实现的关键 拷贝构造函数
乐仓商城手机端原型--V2.0--0307.rp
这是一个BBS论坛原型jsp-bbs源码,内有数据库sql2005
项目2界面原型v-1
c++20设计模式-第4章-原型模式代码
axure原型设计-手机壳.zip
最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季...
1. 24设计模式-桥接模式7.实例化2.桥接模式优缺点优:桥接模式概念介绍桥接模式uml图介绍原型模式-实例说明-模拟毛笔原型模式-实例代码DocumentB
原型设计-自驾游奇途.app原型设计-自驾游奇途.app原型设计-自驾游奇途.app
TEM014 - 新版阿里云网站界面高保真原型模板-AxureUX.7z
axure原型设计-图标库3.0.zip
官网后台管理系统原型v1.0-20190705. rp_官网后台原型-互联网其他资源
访客系统原型设计-20170919 - 1.rp