Java经典设计模式-建立型模式-原型模式(Prototype)

原型模式(Prototype)html

该模式的思想就是将一个对象做为原型,对其进行复制、克隆,产生一个和原对象相似的新对象。java

说道复制对象,我将结合对象的浅复制和深复制来讲一下,首先须要了解对象深、浅复制的概念:测试

浅复制:将一个对象复制后,基本数据类型的变量都会从新建立,而引用类型,指向的仍是原对象所指向的。this

深复制:将一个对象复制后,不管是基本数据类型还有引用类型,都是从新建立的。简单来讲,就是深复制进行了彻底完全的复制,而浅复制不完全。prototype

写一个深浅复制的例子:code

package com.mode.create;
 
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 Prototype implements Cloneable, Serializable {
 
    private static final long serialVersionUID = 1L;
 
    private int base;
 
    private Integer obj;
 
     /* 浅复制 */  
    public Object clone() throws CloneNotSupportedException {
        // 由于Cloneable接口是个空接口,你能够任意定义实现类的方法名
        // 如cloneA或者cloneB,由于此处的重点是super.clone()这句话
        // super.clone()调用的是Object的clone()方法
        // 而在Object类中,clone()是native(本地方法)的
        Prototype proto = (Prototype) super.clone();
        return proto;
    }
 
    /* 深复制 */
    public Object deepClone() throws IOException, ClassNotFoundException {
 
        /* 写入当前对象的二进制流 */
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
 
        /* 读出二进制流产生的新对象 */
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }
 
    public int getBase() {
        return base;
    }
 
    public void setBase(int base) {
        this.base = base;
    }
 
    public Integer getObj() {
        return obj;
    }
 
    public void setObj(Integer obj) {
        this.obj = obj;
    }
 
}

测试类:htm

package com.mode.create;
 
import java.io.IOException;
 
public class Test {
    public static void main(String[] args) throws CloneNotSupportedException,
            ClassNotFoundException, IOException {
        Prototype prototype = new Prototype();
        prototype.setBase(1);
        prototype.setObj(new Integer(2));
        /* 浅复制 */ 
        Prototype prototype1 = (Prototype) prototype.clone();
        /* 深复制 */
        Prototype prototype2 = (Prototype) prototype.deepClone();
        System.out.println(prototype1.getObj()==prototype1.getObj());
        System.out.println(prototype1.getObj()==prototype2.getObj());
    }
}

运行结果:对象

参考资料接口

http://www.importnew.com/18390.htmlget

相关文章
相关标签/搜索