Java设计模式四: 原型模式(Prototype Pattern)

网上找了好多这个模型的资料说的都不透彻,看了半天都是云里雾里。只好自己操刀研究一把。

原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.

原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.

示例:

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 class protype implements Cloneable,Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public String name;
	public fuck f;
	public protype(String name){
		this.name = name;
	}
	
	public Object clone() {
		  try {
		   return super.clone();
		  } catch (CloneNotSupportedException e) {   
		   e.printStackTrace();
		   return null;
		  }
		 } 
	
	public Object deepClone(){
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ObjectOutputStream objout;
		try {
			objout = new ObjectOutputStream(out);
			objout.writeObject(protype.this);
			ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
			ObjectInputStream objin = new ObjectInputStream(in);
			return objin.readObject();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

  

import java.io.Serializable;


public class fuck implements Serializable {
        /**
     * 
     */
    private static final long serialVersionUID = -3616639877050139128L;
        String fname;
        public fuck(String name){
            fname = name;
        }
}
技术分享
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        protype p1 = new protype("p1");
        p1.f = new fuck("fuck1"); 
        protype p2 = (protype) p1.clone();
        p2.name = "p2";
        p2.f.fname = "fuck2";
        
        protype p3 = (protype)p1.deepClone();
        p3.name = "p3";
        p3.f.fname = "fuck3";
        
        System.out.println("p1.name="+p1.name+" p2.name="+p2.name);
        System.out.println("f1.name="+p1.f.fname+" f2.name="+p2.f.fname);
        System.out.println("f1.name="+p1.f.fname+" f3.name="+p3.f.fname);
        
        
    }

}
View Code

结果:

p1.name=p1 p2.name=p2
f1.name=fuck2 f2.name=fuck2
f1.name=fuck2 f3.name=fuck3

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。