原型模式 使程式執行更高效

2021-07-09 19:32:56 字數 2048 閱讀 2866

(《設計模式解析與實戰》讀書筆記)

一、定義

用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件;

二、使用場景

(1)類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等,通過原型拷貝避免這些消耗;

(2)通過new產生乙個物件需要非常繁瑣的資料準備或訪問許可權,這時可使用原型模式;

(3)乙個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮使用原型模式拷貝多個物件供呼叫者使用,即保護性拷貝。

三、簡單示例

修改乙份文件,我們一般不會直接修改「原型」,而是拷貝乙份副本進行修改。

/**

* 文件是具體的原型類;cloneable是介面,宣告具備clone能力

*/public

class

worddocument

implements

cloneable

@override

protected worddocument clone() catch (exception e)

return

null;

}public string getmtext()

public

void

setmtext(string mtext)

public arraylistgetmimages()

public

void

addimages(string img)

/*** 列印文件內容

*/public

void

showdocument()

system.out.println("-----列印結束-----");}}

public

class client

}輸出後的結果:

可以看出在副本上修改不會影響到原型。並且通過clone拷貝物件時並不會執行建構函式。

修改client**:

// 修改文件副本

document2.setmtext("這是修改後的副本");

document2.addimages("副本.jpg");

document2.showdocument();

執行結果:

會發現原型被修改了。原因是上述方法只是淺拷貝,document2的mimages只是單純的指向了this.mimages引用,並沒有重新構造乙個mimages物件。

運用深拷貝可解決這個問題,在拷貝時,對於引用型的字段也要採用拷貝的形式,而不是引用的形式。

修改clone()方法:

@override

protected worddocument clone() catch (exception e)

return

null;

}

執行後發現副本新增並不會影響到原型。

所以在使用該模式時盡量使用深拷貝,避免操作副本時影響原始物件的問題。

四、優缺點

優點:

執行模式是在記憶體中二進位製流的拷貝,要比直接new乙個物件效能好很多,特別是要在乙個迴圈體內產生大量的物件時,原型模式可以更好的體現其優點。

缺點:

直接在記憶體中拷貝,建構函式是不會執行的,在實際開發中應該注意這個潛在的問題。優點是減少了約束,缺點也是減少了約束,需要我們在實際應用中考慮。

建立型模式 原型模式

使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...

建立型模式 原型模式

原型 prototype 模式主要用於建立物件的轉殖,通常其最簡單的形式就是採用自定 clone 函式並 傳入物件引數以返回此物件的乙個副本,這在 python 實作上可使用內定 copy.cop y 或 copy.deepcopy 函式來達到此目的。當已有乙個物件但對此物件的某些部分會被變更卻又想...

原型模式 建立型模式

文章首發個人部落格 如果我們有乙個類 sheep 它裡面有兩個屬性,名稱 name 年齡 age 現在我們有乙個它的例項 s1 我們需要按照這個例項的屬性再去建立兩個物件。1 sheep data public class sheep 2 main public class main 原型模式 用原...