Prototype Pattern -- 複製建立物件個體

用的時間點

如果利用 new 建立物件個體時,都必須指定類別名稱。但有時候會需要不靠指定類別名稱的方式就能產生物件個體,此時不是利用類別建立物件個體,而是複製物件個體另建一個新物件個體,通常發生在以下的情況:

  1. 種類過多無法整成類別時: 若需處理的物件種類太多,如果要一個個設定成不同的類別,需要產生大量的原始檔。

  2. 不容易利用類別產生物件個體時: 該物件個體的產生過程太複雜,很難利用類別來建立。假設現在有一個物件個體是使用者在圖形編輯軟體下利用滑鼠操作而產生。要想以程式來產生這樣一個原本是使用者操作所建立的物件個體,其實不容易。如果是在已經有一個以使用者操作的方式產生的物件個體,還想再建立一個相同物件個體的情形時,應該先把已產生的物件個體暫時儲存起來,等到需要產生時再複製即可。

3.希望把框架和所產生的物件個體分開時: 希望讓產生物件個體時的框架不會只存在在某些特殊類別時。遇到這種情形時,就不能沿用指定類別名稱產生物件個體的作法,應該預先把用來當作雛型的物件個體登錄進去,再以複製已登錄物件個體的方式來產生物件個體。

從一個現有的物件個體建立另外一個新物件個體有點像是到麵包店指著玻璃櫃的某種甜點,跟老闆說我要這個的感覺。雖然不知道甜點叫什麼名字,也不知道這種甜點的作法,但只要一指眼前的甜點,還是可以買到跟這個相同的東西。

如何設計

不是利用類別產生物件個體,而是從一個物件個體產生出另外一個新物件個體。

程式範例

為字串設計外框。

Prototype 參與者

Prototype 規定複製物件個體再建立新物件個體的方法。例如 Product 介面。

ConcreteProduct 參與者

ConcreteProduct 是實際上實作先複製物件個體再建立新物件個體的方法。例如 MessageBox 以及 UnderlinePen 類別。

Client 參與者

Client 利用複製物件個體的方法以產生另外一個新物件個體,例如 Manager 類別。

優點

Prototype Pattern 有效解決以下三種情形。

種類過多無法整合成類別時

程式範例列出了下面三種雛型:

  • 以'~'把字串加上底線
  • 以'*'把字串加上外框
  • 以'/'把字串加上外框

日後還可能再增加更多雛型,如果全部都要做成不同的類別,類別數量會很可觀,增加管理程式原始碼的難度。

不容易利用類別產生物件個體時

假設有一個表示原本以人工操作之圖形的物件個體,而現在要建立一個完全相同的新物體,利用物件個體複製的方式,就輕鬆很多。

不容易利用類別產生物件個體時

把執行物件個體的複製放在 framework package 中。

產生物件個體時不以類別名稱傳遞,例如,以 strong message 取代。這可以說是讓框架脫離類別的束縛。