最近剛重溫完經(jīng)典書籍《EffectiveObjective-C2.0編寫高質(zhì)量iOS與OSX代碼的52個(gè)有效方法》,接下來準(zhǔn)備把設(shè)計(jì)模式掃掃盲,強(qiáng)烈推薦圖書《Head First設(shè)計(jì)模式》,如果看完了有空可以翻翻《大話設(shè)計(jì)模式》或者《設(shè)計(jì)模式之禪》,這幾篇就是閱讀學(xué)習(xí)設(shè)計(jì)模式的產(chǎn)物吧。因設(shè)計(jì)模式大致可分三種類型以及MVX架構(gòu)系列,所以總共分了4篇來講解:
創(chuàng)建型模式篇,結(jié)構(gòu)性模式篇,行為型模式篇,架構(gòu)型模式篇,這是第一篇,由于個(gè)人能力有限,難免有一些遺漏或者錯(cuò)誤,請各位看官不吝賜教!謝謝!本文所有Demo可以在我的Git上獲取,請點(diǎn)擊這里

閑言碎語不多講,上圖是本系列的一個(gè)總體大綱。這篇文章是第一部:創(chuàng)建型模式。不過在開講之前首先說一下設(shè)計(jì)模式的六大原則:

關(guān)于這六大原則的解釋,具體可以看我之前整理的一篇文章,請點(diǎn)擊這里前往
創(chuàng)建型模式包括:
原型模式,單例模式,工廠方法模式,抽象工廠模式,建造者模式,下面我們就通過Demo來一個(gè)一個(gè)講解。
原型模式(Prototype):
1. 定義:原型模式是通過克隆已有的對象來創(chuàng)建新的對象,已有的對象稱為原型。通俗來講,原型模式就是允許你創(chuàng)建現(xiàn)有對象的副本并根據(jù)需要進(jìn)行修改,而不是從頭開始創(chuàng)建對象并進(jìn)行設(shè)置。
2. 使用場景:通過初始化產(chǎn)生一個(gè)對象需要非常繁瑣的準(zhǔn)備步驟,也就是新生成一個(gè)對象的代價(jià)比較大,則可以考慮使用原型模式。
3. 具體實(shí)現(xiàn):原型模式實(shí)現(xiàn)起來比較簡單,iOS實(shí)現(xiàn)這個(gè)模式用的就是copy方法,如果是類使用copy,那這個(gè)類就要實(shí)現(xiàn)。NSCopying協(xié)議中的copyWithZone方法,告訴程序如何復(fù)制該對象。(當(dāng)然也可以自己定義協(xié)議和自定義copy方法來克隆,但是不建議這樣做)。具體代碼可以看Demo。另外在Foudation框架中你也會(huì)找到大量實(shí)現(xiàn)了NSCopying或者NSMutableCopying的類。
4.優(yōu)點(diǎn): 在某些場景可以避免內(nèi)存開銷大的創(chuàng)建初始化動(dòng)作。
5.缺點(diǎn): 基本沒有缺點(diǎn)可言。
6.注意事項(xiàng): 涉及到copy,注意下深復(fù)制和淺復(fù)制就好。
單例模式(Singleton):
1.定義: 單例模式能夠確保某個(gè)類在應(yīng)用中只存在一個(gè)實(shí)例,創(chuàng)建之后會(huì)向整個(gè)系統(tǒng)共用這個(gè)實(shí)例。
2. 使用場景: 需要用來保存全局的狀態(tài),并且不和任何作用域綁定的時(shí)候可以考慮單例。
3. 具體實(shí)現(xiàn):
最簡單最常見的一種實(shí)現(xiàn)方式:
+ (instancetype)sharedInstance {
static id shareInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareInstance = [[self alloc] init];
});
return shareInstance;
}
4.優(yōu)點(diǎn):在某些場景節(jié)省了一些內(nèi)存開銷,尤其是對一個(gè)需要頻繁創(chuàng)建銷毀的對象。
5.缺點(diǎn):單例對象一旦建立,對象指針是保存在靜態(tài)區(qū)的,單例對象在堆中分配的內(nèi)存空間,會(huì)在應(yīng)用程序終止后才會(huì)被釋放。?雖然也可以做到提前釋放,但一般很少這樣去做。另外單例類無法繼承,擴(kuò)展很困難。
6.注意事項(xiàng): 單例模式比較常用,也可能是很多初級(jí)工程師唯一會(huì)使用的設(shè)計(jì)模式。這里還是要盡量避免濫用單例,大家可以查看這篇文章 另外還要防止一下對單例對象的copy操作。
工廠方法模式(FactoryMethod):
1.定義: 定義一個(gè)用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個(gè)類。
2. 使用場景: 當(dāng)存在多個(gè)類共同實(shí)現(xiàn)一個(gè)協(xié)議或者共同繼承一個(gè)基類的時(shí)候,需要?jiǎng)?chuàng)建不同的對象,這個(gè)時(shí)候就可以考慮是否有必要使用工廠類進(jìn)行管理。
3. 具體實(shí)現(xiàn): 這里引用《設(shè)計(jì)模式之禪》一書中女媧造人的示例,具體實(shí)現(xiàn)請看demo,另外還有工廠方法模式還可以縮小成簡單工廠模式,形如:
//CarFactory.m
+ (Car *)createCarWithType:(NSIntger)passengersCount {
if (passengersCount < 2) {
return [[SportCar alloc] init];
} else if (passengersCount < 4) {
return [[NormalCar alloc] init];
} else {
return [[SUV alloc] init];
}
}
但簡單工廠模式的耦合和擴(kuò)展方面存在一些問題,基本所有使用簡單工廠模式的地方都可以用依賴注入來解決掉這個(gè)問題。
4.優(yōu)點(diǎn): 1.在工廠方法中,用戶只需要知道所要產(chǎn)品的具體工廠,不需要知道具體的創(chuàng)建過程,甚至不需要具體產(chǎn)品類。2.在系統(tǒng)增加新的產(chǎn)品時(shí),我們只需要添加一個(gè)具體產(chǎn)品類和對應(yīng)的實(shí)現(xiàn)工廠,無需對原工廠進(jìn)行任何修改,很好地符合了“開閉原則”。
5.缺點(diǎn): 每次增加一個(gè)產(chǎn)品時(shí),都需要增加一個(gè)具體類和對象實(shí)現(xiàn)工廠,代碼量會(huì)增加,也增加了系統(tǒng)的復(fù)雜度。
抽象工廠模式(AbstractFactory):
1.定義: 抽象工廠模式是工廠方式模式的升級(jí)版本,抽象工廠模式允許調(diào)用組件在不了解創(chuàng)建對象所需類的情況下,創(chuàng)建一組相關(guān)或者互相依賴的對象。
2. 使用場景: 一個(gè)對象族有相同的約束時(shí)可以使用抽象工廠模式。
3. 具體實(shí)現(xiàn): 這里引用了一個(gè)生產(chǎn)門的工廠,木門需要搭配木門安裝工,鐵門需要搭配鐵門安裝工,具體實(shí)現(xiàn)請看demo
4.優(yōu)點(diǎn): 良好的封裝性:抽象工廠模式允許調(diào)用組件不必了解創(chuàng)建對象使用的類,也不必知道為什么選擇這些類,因?yàn)槲铱梢栽诓恍薷恼{(diào)用組件的情況下,對使用的類進(jìn)行修改。
5.缺點(diǎn): 擴(kuò)展產(chǎn)品族困難,需要更改接口及其下所有子類(什么是產(chǎn)品族:在抽象工廠模式中,產(chǎn)品族是指由同一個(gè)工廠生產(chǎn)的。例如蘋果手機(jī),蘋果平板,蘋果電腦)。
建造者模式(Builder):
1.定義: 將一個(gè)復(fù)雜的對象的構(gòu)建與他的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
2. 使用場景: 當(dāng)創(chuàng)建多種風(fēng)格的對象時(shí)或者創(chuàng)建對象時(shí)涉及很多步驟,可以使用建造者模式。
3. 具體實(shí)現(xiàn): 這里舉了一個(gè)手抓餅的例子,5元的不辣手抓餅需要添加(生菜 + 火腿腸 + 雞蛋,味精 + 番茄醬),10元的變態(tài)辣手抓餅需要添加(生菜 + 熱狗 + 肉松 + 里脊 + 芝士,辣椒 + 辣醬 + 麻醬 + 干辣椒 + 剁辣椒 + 老干媽 + 辣椒油),具體實(shí)現(xiàn)請看demo
4.優(yōu)點(diǎn): 1.將產(chǎn)品的創(chuàng)建過程與產(chǎn)品本身分離開來,可以使用相同的創(chuàng)建過程來得到不同的產(chǎn)品。2.每一個(gè)具體建造者都相對獨(dú)立,因此可以很方便地替換具體建造者或增加新的具體建造者。
5.缺點(diǎn): 1.建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),其組成部分相似,如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。2.如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會(huì)導(dǎo)致需要定義很多具體建造者類來實(shí)現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大。
EOF : 這篇文章通過Demo梳理了設(shè)計(jì)模式中的創(chuàng)建型模式,由于個(gè)人能力有限,難免有一些遺漏或者錯(cuò)誤,還請各位看官不吝賜教!下周會(huì)給大家?guī)淼诙?code>結(jié)構(gòu)性模式篇,本文已同步到個(gè)人博客,歡迎關(guān)注,歡迎點(diǎn)贊,歡迎star,歡迎一起交流,一起進(jìn)步!??