4、原型模式

原型模式

定義:用原型實例指定建立對象的種類,而且經過拷貝這些原型建立新的對象。java

解釋:給定一個原型對象來指明所要建立的對象的類型,而後用拷貝這個原型對象的方法來建立出更多的同類型對象。數組

Java中原型模式的實現

在JAVA裏,經過克隆(Clone())方法來實現原型模式。ide

任何類,要想支持克隆,必須實現一個接口 Cloneable,該接口中有clone()方法,能夠在類中重寫自定義的克隆方法。性能

兩種不一樣的克隆形式:this

  • 淺拷貝:拷貝出來的對象實例和原型對象是如出一轍的。在淺拷貝中,若是原型對象的成員變量基本類型,那麼就直接複製,若是是複雜的類型(枚舉、對象、數組)就只複製對應的內存地址。不管原型對象仍是克隆後的對象,只要是修改了複雜的數據類型,那麼兩個對象會同時被修改,由於它們共享同一地址值。
  • 深拷貝:拷貝出來的對象實例和原型對象也是如出一轍的,可是沒有任何關聯,修改其中一個對象,不影響另外一個對象。

淺拷貝

在java中淺拷貝只須要實現Cloneable接口調用Object的clone方法便可code

淺拷貝代碼實現:對象

public class Monkey implements Cloneable{
    private int age;
    private String name;
    //省略get、set方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

深拷貝

在JAVA怎麼作到深度克隆了?經過序列化(Serialization)等方式來進行深度克隆。這個時候要聊一聊什麼是序列化了。簡單的講就是序列化就將對象寫到流的一個過程,寫到流裏面去(就是字節流)就等於複製了對象,可是原來的對象並無動,只是複製將類型經過流的方式進行讀取,而後寫到另外一個內存地址中去。接口

深拷貝代碼實現:內存

public class Monkey implements Cloneable,Serializable{
    private int age;
    
    private Child child;
    //省略get、set方法
    public Monkey deepCopy() throws Exception{
        //將對象寫入流中
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
        //將對象從流中取出來
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return (Monkey) ois.readObject();
    }
}

原型模式的優缺點

優勢作用域

使用原型模型建立一個對象比直接new一個對象更有效率,由於它直接操做內存中的二進制流,特別是複製大對象時,性能的差異很是明顯。

隱藏了製造新實例的複雜性,使得建立對象就像咱們在編輯文檔時的複製粘貼同樣簡單。

缺點

因爲使用原型模式複製對象時不會調用類的構造方法,因此原型模式沒法和單例模式組合使用,由於原型類須要將clone方法的做用域修改成public類型,那麼單例模式的條件就沒法知足了。

使用原型模式時不能有final對象。

Object類的clone方法只會拷貝對象中的基本數據類型,對於數組,引用對象等只能另行拷貝。這裏涉及到深拷貝和淺拷貝的概念。

相關文章
相關標籤/搜索