3.4 PROTOTYPE(原型) — 對象創(chuàng)建型模式

1.意圖

用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象冲粤。

2 動機

你可以通過定制一個通過的圖形編輯器框架和增加一些表示音符、休止符和五線譜的新對象來構造一個樂譜編輯器砸紊。這個編輯器框架可能有一個工具選擇板用于將這些音樂對象加到樂譜中其做。這個選擇板可能還包括選擇、移動和其他操縱音樂對象的工具凌唬。用戶可以點擊音符并使用它將四分音符加到樂譜中并齐。或者它們可以使用移動工具在五線譜上下移動一個音符客税,從而改變它的音調况褪。

我們假定該框架為音符和五線譜這樣的圖形構件提供了一個抽象的Graphics類。此外更耻,為定義選擇板中的那些工具测垛,還提供了抽象類Tool。該框架還創(chuàng)建圖形對象實例并將它們加入到文檔中的工具預定義了一個GraphicTool子類秧均。

但GraphicTool給框架設計者帶來一個問題食侮,音符和五線譜的類特定于我們的應用号涯,而GraphicTool類卻屬于框架。GraphicTool不知道如何創(chuàng)建我們的音樂類的實例锯七,并將它們添加到樂譜中链快。我們可以為每一個音樂對象的類別上有所不同。我們知道對象復合是比創(chuàng)建子類更靈活的一種選擇起胰,問題是久又,該框架怎么樣用它來參數(shù)化GraphicTool的實例巫延,而這些實例是由Graphic類所支持創(chuàng)建的效五。

解決辦法是讓GraphicTool通過拷貝或者克隆Graphic子類的一個實例來創(chuàng)建新的Graphic,我們稱這個實例為一個原型炉峰。GraphicTool將它應該克隆和添加到文檔中的原型作為參數(shù)畏妖。如果所有Graphic子類都支持一個Clone操作,那么GraphicTool可以克隆所有種類的Graphic疼阔,如下圖所示:


image.png

因此在我們的音樂編輯器中戒劫,用于創(chuàng)建音樂對象的每一種工具都是一個不同原型進行初始化的GraphicTool實例,通過Clone一個音樂對象的原型并將這個Clone添加到樂譜中婆廊,每一個GraphicTool實例都會產生一個音樂對象迅细。

我們甚至可以進一步使用Prototype模式來減少類的數(shù)目。我們使用不同的類來表示全音符和半音符淘邻,但可能不需要這么做茵典。它們可以是使用不同位圖和時延初始化的相同的類的實例。一個創(chuàng)建全音符的工具就是這樣的GraphicTool宾舅,它的原型是一個被初始化成全音符的MusicalNote统阿。這可以極大的減少系統(tǒng)種類的數(shù)目,同時也更易于在音樂編輯器中增加新的樂符筹我。

3 適用性

當一個系統(tǒng)應該獨立于它的產品創(chuàng)建扶平、構成和表示時,要使用Prototype模式
- 當要實例化的類是在運行時刻指定時蔬蕊,例如通過動態(tài)加載
- 為了避免創(chuàng)建一個與產品層次平行的工廠類層次時
- 當一個類的實例只能有幾個不同狀態(tài)組合中的一種時结澄,建立相應數(shù)目的原型并克隆它可能比每次用合適的狀態(tài)手工實例化該類更方便一些。

4 結構
image.png
5 參與者
- Prototype(Graphic)——聲明一個克隆自身的接口
- ConcretePrototype(Staff岸夯、WholeNote概而、HalfNote)——實現(xiàn)一個克隆自身的操作
- Client(GraphicTool)——讓一個原型克隆自身從而創(chuàng)建一個新的對象
6 協(xié)作

客戶請求一個原型克隆自身

7 效果
- 1.運行時刻增加和刪除產品;
- 2.改變值以指定新對象囱修;
- 3.改變結構以指定新對象赎瑰;
- 4.減少子類的構造;
- 5.用類動態(tài)配置應用破镰;
8 實現(xiàn)

當實現(xiàn)原型時餐曼,要考慮下面一些問題
- 1 使用一個原型管理器:當一個系統(tǒng)中原型數(shù)目不固定時(也就是說压储,它們可以動態(tài)創(chuàng)建和銷毀),要保持一個可用原型的注冊表源譬;
- 2 實現(xiàn)克隆操作Prototype模式最困難的部分在于正確實現(xiàn) Clone操作集惋。當對象結構包含循環(huán)引用時,這尤為棘手踩娘。
- 3 初始化克隆對象

9 代碼示例

github地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末刮刑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子养渴,更是在濱河造成了極大的恐慌雷绢,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件理卑,死亡現(xiàn)場離奇詭異翘紊,居然都是意外死亡,警方通過查閱死者的電腦和手機藐唠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門帆疟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宇立,你說我怎么就攤上這事踪宠。” “怎么了妈嘹?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵柳琢,是天一觀的道長。 經(jīng)常有香客問我蟋滴,道長染厅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任津函,我火速辦了婚禮肖粮,結果婚禮上,老公的妹妹穿的比我還像新娘尔苦。我一直安慰自己涩馆,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布允坚。 她就那樣靜靜地躺著魂那,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稠项。 梳的紋絲不亂的頭發(fā)上涯雅,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音展运,去河邊找鬼活逆。 笑死精刷,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蔗候。 我是一名探鬼主播怒允,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锈遥!你這毒婦竟也來了纫事?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤所灸,失蹤者是張志新(化名)和其女友劉穎丽惶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庆寺,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蚊夫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年诉字,在試婚紗的時候發(fā)現(xiàn)自己被綠了懦尝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡壤圃,死狀恐怖陵霉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情伍绳,我是刑警寧澤踊挠,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站冲杀,受9級特大地震影響效床,放射性物質發(fā)生泄漏。R本人自食惡果不足惜权谁,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一剩檀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旺芽,春花似錦沪猴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悯舟,卻和暖如春担租,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抵怎。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工奋救, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阱洪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓菠镇,卻偏偏與公主長得像冗荸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子利耍,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容