1. 程式人生 > >設計模式 --- 原型模式

設計模式 --- 原型模式

1.定義

用原型例項建立指定物件的種類,並通過複製這些原型建立新物件。

 

2.使用場景

a.類初始化需要消耗非常多的資源,包括資料資源、硬體資源,通過原型複製,避免這種資源消耗。

b.通過new產生一個物件需要非常繁瑣的資料準備或訪問許可權。

c.一個物件需要提供給其他物件訪問,而且各個呼叫者都需要修改其值時,可以考慮複製多個物件供呼叫者使用,實現保護性拷貝。

 

3.簡單實現

通過實現Cloneable介面和覆寫clone方法實現原型模式

//文件物件 實現Cloneable介面
public  class WordDoc implements Cloneable{
    private String txt;
    private String mImages ;

    public WordDoc(){
        System.out.print("WordDoc建構函式");
    }

    public String getTxt() {
        return txt;
    }

    public void setTxt(String txt) {
        this.txt = txt;
    }

    public String getmImages() {
        return mImages;
    }

    public void setmImages(String mImages) {
        this.mImages = mImages;
    }

    public String showDoc() {
        return " Word txt:" + txt +" , imgs: " + mImages +" ";
    }

    //覆寫clone方法
    @Override
    protected WordDoc clone() {
        try {
            WordDoc doc = (WordDoc) super.clone();
            doc.txt = this.txt;
            doc.mImages = this.mImages;
            return doc;
        }catch (Exception e){
            e.printStackTrace();
        }
        return  null;

    }
}
public static void main(String[] args){
    //建立一個原始文件
    WordDoc wordDoc = new WordDoc();
    wordDoc.setTxt("原始文件");
    wordDoc.setmImages("原始圖片");
    System.out.print("\n" + wordDoc.showDoc());

    //以原始文件為原型 拷貝副本
    WordDoc doc1 = wordDoc.clone();
    System.out.print("\n"+ doc1.showDoc());
    //修改副本
    doc1.setTxt("doc1 修改");
    doc1.setmImages("doc1 修改圖片");
    System.out.print("\n" + doc1.showDoc());
    //檢視原始文件
    System.out.print("\n" + wordDoc.showDoc());


}

輸出:

注意clone方法並不是Cloneable介面中的,而是Object中的方法,Cloneable也是一個介面標識,它表明這個類的物件是可拷貝的,如果沒有實現Cloneable介面卻呼叫了clone()會丟擲異常。

還用通過clone拷貝的物件並不會執行建構函式!如在建構函式中需要有特殊的初始化操作型別,在使用Cloneable實現拷貝的時候需要注意建構函式不會執行。

還需要注意深拷貝淺拷貝問題,即在拷貝物件的時候,對引用型的欄位也要採用拷貝的形式。

 

4.小結

原型模式本質上是物件的拷貝,可以解決對構建複雜物件資源消耗問題,還有一個重要用途就是保護性拷貝,如果這個物件是隻讀物件,可以通過返回一個物件的拷貝的形式。

優點:

原型模式是記憶體中二進位制流的拷貝,要比直接new物件效能好很多

缺點:

開發過程中要主要建構函式不會執行的問題