iOS設(shè)計(jì)模式-原型模式

何為原型模式撞牢?

原型模式:例如客戶端知道抽象Prototype類摆马,在運(yùn)行時(shí)性穿,抽象Prototype子類的任何對(duì)象都可以按客戶端的意愿被復(fù)制。因此愕鼓,無需手工創(chuàng)建就可以制造同一類型的多個(gè)實(shí)例钙态。可以簡單理解為創(chuàng)建第一個(gè)模版對(duì)象菇晃,然后通過復(fù)制(深拷貝)模版來創(chuàng)建新的對(duì)象册倒。
從功能的角度看,不管什么對(duì)象磺送,只要復(fù)制自身比手工實(shí)例化要好驻子,都可以是原型對(duì)象。

何時(shí)使用原型模式估灿?

1.需要?jiǎng)?chuàng)建的對(duì)象應(yīng)獨(dú)立于其類型與創(chuàng)建方式崇呵。是說想要?jiǎng)?chuàng)建的對(duì)象不能直接通過初始化函數(shù)來創(chuàng)建,創(chuàng)建方式不具有普遍性馅袁,比較復(fù)雜域慷。
2.要實(shí)例化的類是在運(yùn)行時(shí)決定的。是說在編寫代碼時(shí)汗销,并不知道哪種對(duì)象會(huì)被創(chuàng)建犹褒,取決于用戶的操作,且內(nèi)部結(jié)構(gòu)復(fù)雜弛针。
3.不想要與產(chǎn)品層次相對(duì)應(yīng)的工廠層次叠骑。是說不通過工廠方法或抽象工廠來控制產(chǎn)品的創(chuàng)建過程。
4.不用類的實(shí)例間的差異僅是狀態(tài)的若干組合削茁。因此復(fù)制相應(yīng)數(shù)量的原型比手工實(shí)例化更加方便宙枷。
5.類不容易創(chuàng)建,比如每個(gè)組件可把其他組件作為子節(jié)點(diǎn)的組合對(duì)象付材。復(fù)制已有的組合對(duì)象并對(duì)副本進(jìn)行修改會(huì)更加容易朦拖。

兩種特別常見的情形:
1.有很多相關(guān)的類,其行為略有不同厌衔,,而且主要差異在于內(nèi)部屬性捍岳,如名稱富寿、圖像睬隶。
2.需要使用組合(樹型)對(duì)象作為其他東西的基礎(chǔ),例如页徐,使用組合對(duì)象作為組建來構(gòu)建另一個(gè)組件對(duì)象苏潜。

原理UML圖

UML.jpeg

簡單使用

定義協(xié)議

#import <Foundation/Foundation.h>

@protocol PrototypeProtocol <NSObject>

- (id)copy;

@end

Prototype子類

//.h
#import <Foundation/Foundation.h>

#import "PrototypeProtocol.h"

@interface Prototype : NSObject<PrototypeProtocol,NSCopying>

@property (nonatomic, copy) NSString * name;

@end
//.m
#import "Prototype.h"

@implementation Prototype

- (id)copyWithZone:(NSZone *)zone{
    
    Prototype * prototype = [[self class] allocWithZone:zone];
    
    prototype.name = self.name;
    
    return prototype;

}

@end

Prototype子類遵守協(xié)議。
并一起遵守NSCopying協(xié)議变勇,然后重寫-(id)copyWithZone:(NSZone *)zone方法恤左。
而且通過上述代碼可以發(fā)現(xiàn),我們并沒有用copy方法搀绣,而是用copyWithZone:方法飞袋,這是因?yàn)镹SObject協(xié)議沒有聲明copy方法,但是NSObject聲明了NSObject型的接收器收到copy消息時(shí)链患,NSObject會(huì)依次向其采用了NSCopying協(xié)議的子類轉(zhuǎn)發(fā)消息巧鸭。子類要實(shí)現(xiàn)所需的NSCopying中定義的copyWithZone:方法,以返回自身的副本麻捻。如果子類沒有實(shí)現(xiàn)此方法纲仍,會(huì)拋出NSInvalidArgumentException的實(shí)例。這就是為什么要讓Prototype類采用NSCopying協(xié)議并為復(fù)制處理實(shí)現(xiàn)其copyWithZone:方法贸毕。而NSObject協(xié)議沒有聲明copy方法郑叠,所以在PrototypeProtocol協(xié)議聲明它,以避免編譯警告明棍。
在重寫時(shí)乡革,使用了[self class]是因?yàn)橄M渥宇愐材軌驈?fù)用這個(gè)復(fù)制方法。

//ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    Prototype * p = [[Prototype alloc] init];
    
    p.name = @"John";
    
    Prototype * p1 = [p copy];
    
    p1.name = @"Bob";
    
    NSLog(@"p.name == %@----p1.name == %@",p.name,p1.name);
}
//p.name == John----p1.name == Bob

雖然使用的例子比較簡單击蹲,但是便于理解署拟,假如類的內(nèi)部屬性較多,實(shí)例化比較復(fù)雜歌豺,原型模式將會(huì)是非常簡單的創(chuàng)建模式推穷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市类咧,隨后出現(xiàn)的幾起案子馒铃,更是在濱河造成了極大的恐慌,老刑警劉巖痕惋,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件区宇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡值戳,警方通過查閱死者的電腦和手機(jī)议谷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堕虹,“玉大人卧晓,你說我怎么就攤上這事芬首。” “怎么了逼裆?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵郁稍,是天一觀的道長。 經(jīng)常有香客問我胜宇,道長耀怜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任桐愉,我火速辦了婚禮财破,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仅财。我一直安慰自己狈究,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布盏求。 她就那樣靜靜地躺著抖锥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碎罚。 梳的紋絲不亂的頭發(fā)上磅废,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音荆烈,去河邊找鬼拯勉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憔购,可吹牛的內(nèi)容都是我干的宫峦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼玫鸟,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼导绷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屎飘,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤妥曲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后钦购,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檐盟,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年押桃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葵萎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陌宿,靈堂內(nèi)的尸體忽然破棺而出锡足,到底是詐尸還是另有隱情波丰,我是刑警寧澤壳坪,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站掰烟,受9級(jí)特大地震影響爽蝴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纫骑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一蝎亚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧先馆,春花似錦发框、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仿野,卻和暖如春铣减,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脚作。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工葫哗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人球涛。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓劣针,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亿扁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捺典,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 本文大部分內(nèi)容翻譯至《Pro Design Pattern In Swift》By Adam Freeman,一...
    ZhouMac閱讀 667評(píng)論 0 2
  • 原型模式 介紹 在許多面向?qū)ο蟮膽?yīng)用程序中魏烫,有些對(duì)象的創(chuàng)建代價(jià)過大或者過于復(fù)雜辣苏。要是可以重建相同的對(duì)象并作輕微的改...
    666真666閱讀 446評(píng)論 0 2
  • 啥叫原型模式? 創(chuàng)建一個(gè)新的對(duì)象哄褒,然后通過復(fù)制現(xiàn)有的對(duì)象稀蟋,稱為原型。原型本身使用模板創(chuàng)建呐赡,后續(xù)實(shí)例是克隆模板產(chǎn)生的...
    江將蔣醬閱讀 734評(píng)論 0 1
  • 基本概念 原型模式:用原型實(shí)例指定創(chuàng)建對(duì)象的種類退客,并且通過拷貝這些原型創(chuàng)建新的對(duì)象 從上圖可以看到,Prototy...
    傻傻小蘿卜閱讀 614評(píng)論 0 1
  • 原型模式(prototype) 原型模式最初的定義出現(xiàn)于《設(shè)計(jì)模式》(Addison-Wesley,1994) 原...
    Ro_bber閱讀 305評(píng)論 0 2