原型模式

1 前言

在許多面向?qū)ο蟮膽?yīng)用程序中钠糊,有些對(duì)象的創(chuàng)建代價(jià)過(guò)于大或者過(guò)于復(fù)雜垫言。要是可以重建相同的對(duì)象并作輕微的改動(dòng)杉女,事情會(huì)容易許多。我們可以通過(guò)輕微的改動(dòng)重用已有的對(duì)象鸳吸,以適應(yīng)程序中的特定情況熏挎。今天我們就來(lái)學(xué)習(xí)一下該模式。

2 詳述

2.1 定義

應(yīng)用于“復(fù)制”操作的模式成為原型(Prototype)模式层释。復(fù)制(cloning)指用同一模具生產(chǎn)一系列的產(chǎn)品婆瓜。模具所基于的物品稱為原型。盡管產(chǎn)品是用同一模具復(fù)制的贡羔,但是某些屬性廉白,如顏色與尺寸,可以稍有不同乖寒,但是他們還是屬于同一類猴蹂。

2.2 何時(shí)是用原型模式

(1)需要?jiǎng)?chuàng)建的對(duì)象應(yīng)獨(dú)立于其類型與創(chuàng)建方式。

(2)要實(shí)例化的類是在運(yùn)行時(shí)決定的楣嘁。

(3)不想要與產(chǎn)品層次相對(duì)應(yīng)的工廠層次磅轻。

(4)不同類的實(shí)例間的差異僅是狀態(tài)的若干組合。因此復(fù)制相應(yīng)數(shù)量的原型比手工實(shí)例化更加方便逐虚。

(5)類不容易創(chuàng)建聋溜,比如每個(gè)組件可以把其他組件作為子節(jié)點(diǎn)的組合對(duì)象。復(fù)制已有的組合對(duì)象并對(duì)副本進(jìn)行修改會(huì)更加容易叭爱。

此模式的最低限度是生成對(duì)象的真實(shí)副本撮躁,以用作同一環(huán)境下其他相關(guān)事物的基礎(chǔ)(原型)。

2.3 淺復(fù)制與深復(fù)制

深復(fù)制就是開(kāi)辟新內(nèi)存實(shí)現(xiàn)真正的內(nèi)存復(fù)制, 淺復(fù)制, 只復(fù)制指針, 堆內(nèi)存不變. 在我們?cè)O(shè)計(jì)系統(tǒng)時(shí), 有時(shí)一些對(duì)象需要根據(jù)用戶操作完成拷貝備份等操作, 這時(shí)候, 如果再去按照原來(lái)的方法初始化一遍對(duì)象就會(huì)帶來(lái)一些不便和問(wèn)題:

(1)該對(duì)象的某些屬性是在用戶操作過(guò)程中產(chǎn)生的, 不能夠僅憑一個(gè)initXXX方法賦值;

(2)常規(guī)賦值太過(guò)麻煩, 而且破壞封裝.

這時(shí)候原型模式的優(yōu)勢(shì)便體現(xiàn)出來(lái)了买雾。

3.Demo

首先創(chuàng)建一個(gè)Player類, 擁有2個(gè)屬性highestLevel和currentLevel, 同時(shí)提供2個(gè)public方法修改這2個(gè)屬性. 代碼如下:

復(fù)制代碼代碼如下:

@interface Player : NSObject

/**

*? update player's current level during game

*

*? @param level

*/

- (void)updateCurrentLevel:(NSInteger)level;

/**

*? update player's highest level during game

*

*? @param level

*/

- (void)updateHighestLevel:(NSInteger)level;

@end

最為關(guān)鍵的是Player需要實(shí)現(xiàn)NSCopying協(xié)議:

復(fù)制代碼代碼如下:

#pragma mark - Override

- (instancetype)copyWithZone:(NSZone *)zone

{

Player *copyPlayer = [[[self class] allocWithZone:zone] init];

copyPlayer.highestLevel = self.highestLevel;

copyPlayer.currentLevel = self.currentLevel;

return copyPlayer;

}

這里大家看到NSZone類型, 這是個(gè)什么類型呢? 其實(shí)它是一個(gè)結(jié)構(gòu)體, 是為了防止內(nèi)存碎片化而引入的一個(gè)結(jié)構(gòu). NSZone會(huì)根據(jù)你想要開(kāi)辟的內(nèi)存大小來(lái)分配內(nèi)存, 提高內(nèi)存管理. 然而官方的Programming with ARC Release Note也指出把曼, 目前的runtime系統(tǒng)忽略了區(qū)域的概念,因?yàn)楸旧淼膬?nèi)存管理已經(jīng)非常有效率漓穿,使用Zone反而會(huì)降低內(nèi)存使用嗤军,訪問(wèn)效率, 增加源代碼復(fù)雜度等.所以一般不使用NSZone, 而在這個(gè)例子中晃危, 雖說(shuō)使用了allocWithZone的方法, 但是我們進(jìn)去看源代碼則會(huì)發(fā)現(xiàn): Apple其實(shí)還是用一般的初始化方法代替了原來(lái)的Zone開(kāi)辟:

復(fù)制代碼代碼如下:

#pragma mark - Override

- (instancetype)copyWithZone:(NSZone *)zone

+ (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object?

initializers instead");

原型設(shè)計(jì)模式基本就是這些, 當(dāng)然我們的Player類可以變成一個(gè)接口, 讓子類去實(shí)現(xiàn), 更好的體現(xiàn)面向接口編程.

結(jié)果:

2015-09-18 21:30:32.072 DP_Prototype[1173:280693]

2015-09-18 21:30:32.073 DP_Prototype[1173:280693]

在其他文件調(diào)用copy方法, 即可看到系統(tǒng)為我們新開(kāi)辟的一塊內(nèi)存, 引用計(jì)數(shù)為1.

4.Cocoa Touch框架中的對(duì)象復(fù)制

CocoaTouch框架為NSObject的派生類提供了實(shí)現(xiàn)深復(fù)制的協(xié)議叙赚。NSObject的子類需要實(shí)現(xiàn)NSCopying協(xié)議及其方法--(id)copyWithZone:(NSZone *)zone。NSObject有一個(gè)實(shí)例方法叫做(id)copy山害。默認(rèn)的copy方法調(diào)用[selfcopyWithZone:nil]纠俭。對(duì)于采納了NSCopying協(xié)議的子類,需要實(shí)現(xiàn)這個(gè)方法浪慌,否則將引發(fā)異常冤荆。IOS中,這個(gè)方法保持新的副本對(duì)象权纤,然后將其返回钓简。此方法的調(diào)用者需要負(fù)責(zé)釋放返回的對(duì)象乌妒。

深復(fù)制的技巧在于:保證確實(shí)復(fù)制了內(nèi)存中的資源,而不只是指指針外邓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撤蚊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子损话,更是在濱河造成了極大的恐慌侦啸,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丧枪,死亡現(xiàn)場(chǎng)離奇詭異光涂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拧烦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門忘闻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人恋博,你說(shuō)我怎么就攤上這事齐佳。” “怎么了债沮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵炼吴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我疫衩,道長(zhǎng)缺厉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任隧土,我火速辦了婚禮,結(jié)果婚禮上命爬,老公的妹妹穿的比我還像新娘曹傀。我一直安慰自己,他們只是感情好饲宛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布皆愉。 她就那樣靜靜地躺著,像睡著了一般艇抠。 火紅的嫁衣襯著肌膚如雪幕庐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,906評(píng)論 1 290
  • 那天家淤,我揣著相機(jī)與錄音异剥,去河邊找鬼。 笑死絮重,一個(gè)胖子當(dāng)著我的面吹牛冤寿,可吹牛的內(nèi)容都是我干的歹苦。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼督怜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼殴瘦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起号杠,我...
    開(kāi)封第一講書(shū)人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚪腋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后姨蟋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屉凯,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年芬探,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了神得。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偷仿,死狀恐怖哩簿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酝静,我是刑警寧澤节榜,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站别智,受9級(jí)特大地震影響宗苍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薄榛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一讳窟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敞恋,春花似錦丽啡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至啸蜜,卻和暖如春坑雅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衬横。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工裹粤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜂林。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓蛹尝,卻偏偏與公主長(zhǎng)得像后豫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子突那,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 基本概念 原型模式:用原型實(shí)例指定創(chuàng)建對(duì)象的種類挫酿,并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象 從上圖可以看到,Prototy...
    傻傻小蘿卜閱讀 618評(píng)論 0 1
  • 原型模式 介紹 在許多面向?qū)ο蟮膽?yīng)用程序中愕难,有些對(duì)象的創(chuàng)建代價(jià)過(guò)大或者過(guò)于復(fù)雜早龟。要是可以重建相同的對(duì)象并作輕微的改...
    666真666閱讀 447評(píng)論 0 2
  • 1 場(chǎng)景問(wèn)題# 1.1 訂單處理系統(tǒng)## 考慮這樣一個(gè)實(shí)際應(yīng)用:訂單處理系統(tǒng)。 現(xiàn)在有一個(gè)訂單處理的系統(tǒng)猫缭,里面有個(gè)...
    七寸知架構(gòu)閱讀 4,393評(píng)論 3 63
  • 原型模式是非常簡(jiǎn)單的一種設(shè)計(jì)模式, 在多數(shù)情況下可被理解為一種深復(fù)制的行為葱弟。在Objective-C中使用原型模式...
    塵絮緣12138閱讀 2,569評(píng)論 0 3
  • 1大同小異的工作周報(bào) Sunny軟件公司一直使用自行開(kāi)發(fā)的一套OA (Office Automatic,辦公自動(dòng)化...
    justCode_閱讀 1,151評(píng)論 0 3