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中,实现原型模式相对简单,因为Python提供了内置的`copy`模块,可以方便地实现浅复制和深复制。在`Prototype.py`文件中,我们可能会看到以下代码结构: ```python class Prototype: def __init__(self, ...
在现代产品开发过程中,产品经理往往需要在产品设计和开发前期阶段绘制出产品的原型,以此来明确产品的功能结构、用户交互和界面布局等关键要素。而Axure RP作为一种专业的原型设计工具,在业界享有盛誉,它能够帮助...
JAVA-设计模式-创建型模式-原型模式
原型模式-建造同样的果园 桥接模式-果园实现统一的种植方法 原型模式-建造同样的果园 原型模式-建造同样的果园 适配器模式-果园改变种植方式 原型模式-建造同样的果园 外观模式-种植不同种类的水果
-425款经典优秀H5小游戏合集】游戏源码分享下载 --- hczz.zipHTML5小游戏【横冲直撞(1024原型)--425款经典优秀H5小游戏合集】游戏源码分享下载 --- hczz.zipHTML5小游戏【横冲直撞(1024原型)--425款经典优秀H5小...
Axure9项目原型案例-原型50-案例20-原件1
原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象,从而提高性能,并且可以...
该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。 原型模式的实现思路是:首先,我们需要定义一个原型对象,然后通过该对象的 clone() 方法创建一个新的对象。新的对象将...
在C#中,原型模式允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来创建。这种方法避免了在创建新对象时反复进行相同初始化操作,降低了系统开销。 ### **基本概念** - **原型(Prototype)**: 这是...
在Java、C#等面向对象的语言中,原型模式通过实现`Cloneable`接口或使用序列化机制来实现对象的复制。在这个"原型模式实践代码"中,我们可以预期看到如何在实际编程中应用这一模式。 在Java中,`Cloneable`接口是...
在Java中实现原型模式,首先需要让原型类实现`Cloneable`接口,并重写`clone()`方法。以下是一个简单的示例: ```java public class Prototype implements Cloneable { private String property; public ...
原型模式(Prototype Pattern)是其中一种行为设计模式,它允许我们通过复制现有对象来创建新对象,而不是通过传统方式实例化新对象。这一模式尤其适用于创建复杂或昂贵的对象,因为它提供了对象克隆的能力,从而...
原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...
乐仓商城手机端原型--V2.0--0307.rp
原型模式(Prototype Pattern)是软件设计模式中的一种创建型模式,它提供了一种复制已有对象而不必知道其具体类别的方法。在C++中,原型模式常常利用拷贝构造函数或赋值运算符来实现对象的克隆。这种模式在需要频繁...
3. **应用场景**:原型模式常用于需要大量创建相似对象的场景,如游戏中的角色复制、数据备份、对象配置等。 4. **优缺点**: - 优点:提高了创建新对象的速度,尤其是在对象创建成本较高的情况下。 - 缺点:如果...
在软件设计模式中,原型(Prototype)模式是一种创建型模式,它允许我们通过复制已有对象来创建新对象,而无需知道具体创建过程。这个模式在C++中可以通过实现拷贝构造函数和赋值运算符来实现。下面我们将深入探讨...
2. **避免使用类层次结构**:如果一个类层次结构过于复杂,可以使用原型模式简化结构,将复制作为替代继承的方法。 3. **需要复制现有对象但又不希望知道其具体类**:原型模式允许客户端独立于具体类型进行操作,...
最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季...