`

原型模式--深浅复制公用类

阅读更多
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++)

    在Python中,实现原型模式相对简单,因为Python提供了内置的`copy`模块,可以方便地实现浅复制和深复制。在`Prototype.py`文件中,我们可能会看到以下代码结构: ```python class Prototype: def __init__(self, ...

    Axure产品经理原型教程-入门到精通pdf版

    在现代产品开发过程中,产品经理往往需要在产品设计和开发前期阶段绘制出产品的原型,以此来明确产品的功能结构、用户交互和界面布局等关键要素。而Axure RP作为一种专业的原型设计工具,在业界享有盛誉,它能够帮助...

    JAVA-设计模式-创建型模式-原型模式

    JAVA-设计模式-创建型模式-原型模式

    c# 设计模式实例教程

    原型模式-建造同样的果园 桥接模式-果园实现统一的种植方法 原型模式-建造同样的果园 原型模式-建造同样的果园 适配器模式-果园改变种植方式 原型模式-建造同样的果园 外观模式-种植不同种类的水果

    HTML5小游戏【横冲直撞(1024原型)-425款经典优秀H5小游戏合集】游戏源码分享下载 - hczz.zip

    -425款经典优秀H5小游戏合集】游戏源码分享下载 --- hczz.zipHTML5小游戏【横冲直撞(1024原型)--425款经典优秀H5小游戏合集】游戏源码分享下载 --- hczz.zipHTML5小游戏【横冲直撞(1024原型)--425款经典优秀H5小...

    Axure9项目原型案例-原型50-案例20-原件1

    Axure9项目原型案例-原型50-案例20-原件1

    ava常用设计模式-原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象,从而提高性能,并且可以...

    Java设计模式-原型模式详解

    该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。 原型模式的实现思路是:首先,我们需要定义一个原型对象,然后通过该对象的 clone() 方法创建一个新的对象。新的对象将...

    设计模式之原型模式

    在C#中,原型模式允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来创建。这种方法避免了在创建新对象时反复进行相同初始化操作,降低了系统开销。 ### **基本概念** - **原型(Prototype)**: 这是...

    原型模式实践代码

    在Java、C#等面向对象的语言中,原型模式通过实现`Cloneable`接口或使用序列化机制来实现对象的复制。在这个"原型模式实践代码"中,我们可以预期看到如何在实际编程中应用这一模式。 在Java中,`Cloneable`接口是...

    设计模式之原型模式Java实现和类设计图

    在Java中实现原型模式,首先需要让原型类实现`Cloneable`接口,并重写`clone()`方法。以下是一个简单的示例: ```java public class Prototype implements Cloneable { private String property; public ...

    c++20设计模式-第4章-原型模式代码

    原型模式(Prototype Pattern)是其中一种行为设计模式,它允许我们通过复制现有对象来创建新对象,而不是通过传统方式实例化新对象。这一模式尤其适用于创建复杂或昂贵的对象,因为它提供了对象克隆的能力,从而...

    设计模式——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...

    乐仓商城手机端原型--V2.0--0307.rp

    乐仓商城手机端原型--V2.0--0307.rp

    C++设计模式-原型模式

    原型模式(Prototype Pattern)是软件设计模式中的一种创建型模式,它提供了一种复制已有对象而不必知道其具体类别的方法。在C++中,原型模式常常利用拷贝构造函数或赋值运算符来实现对象的克隆。这种模式在需要频繁...

    原型模式PPT文档

    3. **应用场景**:原型模式常用于需要大量创建相似对象的场景,如游戏中的角色复制、数据备份、对象配置等。 4. **优缺点**: - 优点:提高了创建新对象的速度,尤其是在对象创建成本较高的情况下。 - 缺点:如果...

    原型模式测试浅复制和深复制(C++)

    在软件设计模式中,原型(Prototype)模式是一种创建型模式,它允许我们通过复制已有对象来创建新对象,而无需知道具体创建过程。这个模式在C++中可以通过实现拷贝构造函数和赋值运算符来实现。下面我们将深入探讨...

    设计模式的原型模式的例子

    2. **避免使用类层次结构**:如果一个类层次结构过于复杂,可以使用原型模式简化结构,将复制作为替代继承的方法。 3. **需要复制现有对象但又不希望知道其具体类**:原型模式允许客户端独立于具体类型进行操作,...

    最棒的AXURE原型系列1-6季的全部作品

    最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季...

Global site tag (gtag.js) - Google Analytics