1、意圖
- 用原型實例指定創建對象的種類,並且通過“拷貝這些原型”創建新的對象。
2、問題
- 當一個系統應該獨立於它的產品創建、構成和表示時;
- 當要實例化的類是在運行時指定時(如動態裝載);
- 爲了避免創建一個與產品類層次平行的工廠類層次時;
- 當一個類的實例只能有幾個不同狀態組合中的一種時。
3、解決方案
- 創建產品時,根據原型參數,克隆一個新產品。
4、通用結構
5、參與者
- Prototype:聲明一個克隆自身的接口
- ConcretePrototype:實現一個克隆自身的操作
- Client:通過原型參數克隆自身創建新對象
6、協作
- 客戶請求一個原型,並用之克隆自身。
7、效果
- 運行時刻增加和刪除產品 Prototype模式允許只通過註冊原型實例就可以將一個新的具體產品類併入系統。
- 改變值以指定新對象 高度動態的系統允許你通過對象複合定義新的行爲(不定義新的類)。通過實例化已有類並且將這些實例註冊爲客戶對象的原型。就可以有效定義新類別的對象。客戶可以將職責代理給原型,從而表現出新的行爲。
- 改變結構以指定新對象 許多應用由部件和子部件來創建對象,對於複合結構對象,只要將Clone實現爲深拷貝,也可以成爲原型。
- 減少子類的構造 這一優點主要適用於像C++這樣不將類作爲一級類對象的語言。
- 用類動態配置應用 一個希望創建動態載入類的實例的應用不能靜態引用類的構造器。而應該有運行環境在載入時自動創建每個類的實例,並用原型管理器來註冊這個實例。這樣應用就可以向原型管理器請求新裝載的類的實例,這些類原本並沒有和程序相連接。
8、實現
1)使用一個原型管理器:當一個系統中原型數目不固定時(以動態創建和銷燬),要保持一個可用原型的註冊表。客戶不會自己來管理原型,但會在註冊表中存儲和檢索原型。客戶在克隆一個原型前會向註冊表請求該原型,這個註冊表爲原型管理器。
原型管理器是一個關聯存儲器,它返回一個與給定關鍵字相匹配的原型。它有通過關鍵字註冊和銷燬原型的一些操作。因此客戶可以下運行時更改甚至瀏覽這個註冊表,這使得客戶無需編寫代碼就可以擴展並得到系統清單。2)實現克隆操作:淺拷貝與深拷貝問題
3)初始化克隆對象:通過定義的其他接口,爲克隆的新對象實例初始化。
9、實例