Prototype模式

定義:
用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。

Prototype原型模式是一種創建型設計模式,Prototype模式允許一個對象再創建另外一個可定製的對象,根本無需知道任何如何創建的細節,工作原理是:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。

Prototype類需要具備以下兩個條件:

  • 實現Cloneable接口。在java語言有一個Cloneable接口,它的作用只有一個,就是在運行時通知虛擬機可以安全地在實現了此接口的類上使用clone方法。在java虛擬機中,只有實現了這個接口的類纔可以被拷貝,否則在運行時會拋出CloneNotSupportedException異常。
  • 重寫Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個clone方法,作用是返回對象的一個拷貝,但是其作用域protected類型的,一般的類無法調用,因此,Prototype類需要將clone方法的作用域修改爲public類型。
class Prototype implements Cloneable {    
    public Prototype clone(){    
        Prototype prototype = null;    
        try{    
            prototype = (Prototype)super.clone();    
        }catch(CloneNotSupportedException e){    
            e.printStackTrace();    
        }    
        return prototype;     
    }    
}    

class ConcretePrototype extends Prototype{    
    public void show(){    
        System.out.println("原型模式實現類");    
    }    
}    

public class Client {    
    public static void main(String[] args){    
        ConcretePrototype cp = new ConcretePrototype();    
        for(int i=0; i< 10; i++){    
            ConcretePrototype clonecp = (ConcretePrototype)cp.clone();    
            clonecp.show();    
        }    
    }    
} 

原型模式的注意事項

  • 使用原型模式複製對象不會調用類的構造方法。因爲對象的複製是通過調用Object類的clone方法來完成的,它直接在內存中複製數據,因此不會調用到類的構造方法。不但構造方法中的代碼不會執行,甚至連訪問權限都對原型模式無效。單例模式中,只要將構造方法的訪問權限設置爲private型,就可以實現單例。但是clone方法直接無視構造方法的權限,所以,單例模式與原型模式是衝突的,在使用時要特別注意。
  • 深拷貝與淺拷貝。Object類的clone方法只會拷貝對象中的基本的數據類型(8種基本數據類型byte,char,short,int,long,float,double,boolean),對於數組、容器對象、引用對象等都不會拷貝,這就是淺拷貝。如果要實現深拷貝,必須將原型模式中的數組、容器對象、引用對象等另行拷貝或進行序列化與反序列化後得到對象。
發佈了40 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章