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

相關文章
相關標籤/搜索