常見(jiàn)代碼問(wèn)題:
1烁登、代碼膨脹,代碼達(dá)百萬(wàn)行甚至千萬(wàn)行蔚舀。
2饵沧、代碼的理解和調(diào)試占用較多時(shí)間。
3赌躺、代碼交互復(fù)雜狼牺、模塊相互引用、接口網(wǎng)狀分布礼患。
4是钥、代碼難以修改掠归,易引入新的問(wèn)題,改代碼的時(shí)候戰(zhàn)戰(zhàn)兢兢咏瑟。
5拂到、類(lèi)、方法太復(fù)雜,代碼行太多。
6捺疼、重復(fù)代碼窃植、無(wú)效代碼太多。
7悯森、接口不明確宋舷。
為什么要用設(shè)計(jì)模式:
設(shè)計(jì)模式使代碼編制真正工程化;
設(shè)計(jì)模式是軟件工程的基石脈絡(luò)瓢姻,如同大廈的結(jié)構(gòu)一樣祝蝠。
設(shè)計(jì)模式遵循的原則:
1、一個(gè)類(lèi)應(yīng)該只有一個(gè)發(fā)生變化的原因幻碱。
2绎狭、如果調(diào)用的是父類(lèi)的話(huà),那么換成子類(lèi)也完全可以運(yùn)行褥傍。
3儡嘶、抽象不應(yīng)該依賴(lài)于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴(lài)于抽象恍风。面向接口編程蹦狂,而不是面向?qū)崿F(xiàn)編程。
4朋贬、使用多個(gè)專(zhuān)門(mén)的接口比使用單一的總接口要好凯楔。
客戶(hù)端不應(yīng)該依賴(lài)它不需要的接口;
一個(gè)類(lèi)對(duì)另一個(gè)類(lèi)的依賴(lài)應(yīng)該建立在最小的接口上锦募。
5摆屯、模塊應(yīng)對(duì)擴(kuò)展開(kāi)放,而對(duì)修改關(guān)閉御滩。
6鸥拧、一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解。每個(gè)類(lèi)盡量減少對(duì)其他類(lèi)的依賴(lài)削解。
1.創(chuàng)建型:
單例設(shè)計(jì)模式
抽象工廠設(shè)計(jì)模式
2.結(jié)構(gòu)型:
MVC 模型:
裝飾器模式:
適配器模式:Category(類(lèi)別)和Delegation(委托)
外觀模式:外觀模式針對(duì)復(fù)雜的子系統(tǒng)提供了單一的接口富弦,不需要暴漏一些列的類(lèi)和API給用戶(hù),你僅僅暴漏一個(gè)簡(jiǎn)單統(tǒng)一的API氛驮。
組合模式:
3.行為型:
責(zé)任鏈設(shè)計(jì)模式:
觀察者設(shè)計(jì)模式:Notification(通知)機(jī)制 和 KVO機(jī)制
備忘錄設(shè)計(jì)模式:
命令設(shè)計(jì)模式:
設(shè)計(jì)模式:
實(shí)例方法腕柜,類(lèi)方法,便利構(gòu)造方法
extention(延展) ,Category(類(lèi)別)
KVC
KVO:觀察者的注冊(cè)是在被觀察者的內(nèi)部進(jìn)行的盏缤,不同于通知機(jī)制(由觀察者自己注冊(cè))砰蠢,需要被觀察者和觀察者同時(shí)實(shí)現(xiàn)一個(gè)協(xié)議:NSKeyValueObserving,被觀察者通過(guò)addObserver:forKeypath:options:context方法注冊(cè)觀察者唉铜,以及要被觀察的屬性台舱。
Delegate(代理):java中的接口,類(lèi)可以實(shí)現(xiàn)或不實(shí)現(xiàn)協(xié)議(接口)中的方法潭流。通過(guò)此種方式竞惋,達(dá)到最大的解耦目的,方便項(xiàng)目的擴(kuò)展灰嫉。
Sington(單例)
Notification(通知)機(jī)制
block(回調(diào))
何為單例模式:一個(gè)類(lèi)在系統(tǒng)中只有一個(gè)實(shí)例對(duì)象拆宛。通過(guò)全局的一個(gè)入口點(diǎn)對(duì)這個(gè)實(shí)例對(duì)象進(jìn)行訪問(wèn)。整個(gè)應(yīng)用或系統(tǒng)只能有該類(lèi)的一個(gè)實(shí)例
單例模式靜態(tài)類(lèi)圖:
技術(shù)要點(diǎn):
1讼撒、某個(gè)類(lèi)只能有一個(gè)實(shí)例
2浑厚、它必須自行創(chuàng)建這個(gè)實(shí)例
3、它必須向整個(gè)系統(tǒng)提供這個(gè)實(shí)例
何時(shí)使用單例模式:
1根盒、只能共享而不能復(fù)制的資源钳幅,如CLLocationManager類(lèi)。
2郑象、類(lèi)必須有一個(gè)實(shí)例贡这,而且必須從一個(gè)為人熟知的訪問(wèn)點(diǎn)對(duì)其進(jìn)行訪問(wèn),比如工 廠方法厂榛。
在Objective-C中實(shí)現(xiàn)單例模式:
1盖矫、如何保證類(lèi)只創(chuàng)建一個(gè)實(shí)例?因?yàn)镺C中所有方法都是共有的击奶。
Apple官方文檔里面關(guān)于單例(Singleton)的示范代碼:
static MyGizmoClass *sharedGizmoManager = nil;
-
(MyGizmoClass*)sharedManager
{
if (sharedGizmoManager == nil) {
sharedGizmoManager = [[super allocWithZone:NULL] init];
}return sharedGizmoManager;
} (id)allocWithZone:(NSZone *)zone //避免通過(guò)alloc和init獲取一個(gè)實(shí)例
{
return [[self sharedManager] retain];
}
2辈双、克隆:如果該類(lèi)實(shí)現(xiàn)了NSCopying協(xié)議柜砾,則需要重寫(xiě)copyWithZone湃望。
3、線程安全:如果是多線程的話(huà)痰驱,可以使用@synchronized证芭、NSLock或者dispatch_once_t。
第二種方式:
//Singleton.h
@interface Singleton : NSObject
- (Singleton *)sharedSingleton; <1>
@end
/***************************************************************/
//Singleton.m
import "Singleton.h"
@implementation Singleton
static Singleton *sharedSingleton = nil;<2>
- (Singleton *)sharedSingleton{
static dispatch_once_t once;<3>
dispatch_once(&once,^{
sharedSingleton = [[self alloc] init];<4>
//dosometing
});
return sharedSingleton;<5>
}
<1>聲明一個(gè)可以新建和獲取單個(gè)實(shí)例對(duì)象的方法
<2>聲明一個(gè)static類(lèi)型的類(lèi)變量
<3>聲明一個(gè)只執(zhí)行一次的任務(wù)
<4>調(diào)用dispatch_once執(zhí)行該任務(wù)指定的代碼塊担映,在該代碼塊中實(shí)例化上文聲明的類(lèi)變量
<5>返回在整個(gè)應(yīng)用的生命周期中只會(huì)被實(shí)例化一次的變量
在Cocoa Touch框架中使用單例模式:舉例如下:
1废士、UIApplication,可通過(guò)sharedApplication類(lèi)方法訪問(wèn)蝇完。
2官硝、UIAccelerometer矗蕊,可通過(guò)sharedAccelerometer訪問(wèn)。
3氢架、NSFileManager傻咖,可通過(guò)defaultFileManager訪問(wèn)。
4岖研、NSBundle類(lèi)提供了 +mainBunle方法獲取NSBundle單例
5卿操、NSNotificationCenter提供了 +defaultCenter方法創(chuàng)建和獲取NSNotificationCenter單例(PS:該類(lèi)還遵循了另一個(gè)重要的設(shè)計(jì)模式:觀察者模式)
6,NSUserDefaults類(lèi)提供了 +defaultUserDefaults方法去創(chuàng)建和獲取NSUserDefaults單例
簡(jiǎn)單工廠模式:
這個(gè)類(lèi)即是工廠類(lèi)孙援,專(zhuān)門(mén)用于創(chuàng)建對(duì)象硬纤,向外暴露創(chuàng)建對(duì)象的接口,供外部調(diào)用赃磨。工廠模式有一種非常形象的描述,建立對(duì)象的類(lèi)就如一個(gè)工廠洼裤,而需要被建立的對(duì)象就是一個(gè)個(gè)產(chǎn)品邻辉;在工廠中加工產(chǎn)品,使用產(chǎn)品的人腮鞍,不用在乎產(chǎn)品是如何生產(chǎn)出來(lái)的值骇。
簡(jiǎn)單工廠模式中,工廠類(lèi)是整個(gè)模式的關(guān)鍵移国,其包含必要的判斷邏輯吱瘩,能夠根據(jù)外界給定的信息,決定究竟創(chuàng)建哪個(gè)類(lèi)的實(shí)例迹缀,外界可以不用去關(guān)注對(duì)象的創(chuàng)建使碾,僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了。
專(zhuān)門(mén)定義一個(gè)類(lèi)來(lái)負(fù)責(zé)創(chuàng)建其他類(lèi)的實(shí)例祝懂,被創(chuàng)建的實(shí)例通常都具有共同的父類(lèi)票摇,又稱(chēng)為靜態(tài)工廠方法,我們習(xí)慣稱(chēng)這個(gè)為:實(shí)例方法砚蓬。
優(yōu)缺點(diǎn):
1矢门、優(yōu)點(diǎn):明確區(qū)分了責(zé)任,有利于結(jié)構(gòu)的優(yōu)化灰蛙。從面向?qū)崿F(xiàn)類(lèi)編碼轉(zhuǎn)換為面向接口編程祟剔。
2、缺點(diǎn):集中了所有實(shí)例的創(chuàng)建邏輯摩梧,違反了高內(nèi)聚的責(zé)任分配原則物延,當(dāng)系統(tǒng)的具體產(chǎn)品類(lèi)不斷增多時(shí),工廠類(lèi)中條件判斷過(guò)多障本,不利于擴(kuò)展及維護(hù)教届。
工廠方法模式:
定義創(chuàng)建對(duì)象的接口响鹃,讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi),工廠方法使得一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)案训。
簡(jiǎn)單說(shuō)买置,工廠方法模式,就是針對(duì)不同的產(chǎn)品强霎,使用不同的工廠類(lèi)創(chuàng)建不同的工廠對(duì)象然后生產(chǎn)不同的產(chǎn)品忿项。
何時(shí)使用工廠方法:
1、編譯時(shí)無(wú)法準(zhǔn)確預(yù)期要?jiǎng)?chuàng)建的對(duì)象的類(lèi)城舞。
2轩触、類(lèi)想讓其子類(lèi)決定在運(yùn)行時(shí)創(chuàng)建什么。
工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣家夺。由于使用了多態(tài)性脱柱,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)拉馋。
1.每新增一個(gè)產(chǎn)品類(lèi)榨为,對(duì)應(yīng)就要新建一個(gè)工廠類(lèi),如果產(chǎn)品比較多煌茴,必然會(huì)分配大量的工廠對(duì)象随闺,增加了額外的開(kāi)發(fā)量,這樣維護(hù)的成本勢(shì)必會(huì)增加蔓腐。
2.既然每個(gè)產(chǎn)品的工廠類(lèi)都徹底分開(kāi)獨(dú)立矩乐,這樣某些可以復(fù)用的代碼塊將無(wú)法復(fù)用。
何為抽象工廠:
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口回论,而無(wú)需指定它們具體的類(lèi)散罕。
簡(jiǎn)單說(shuō),抽象工廠在一定程度上對(duì)具有共性產(chǎn)品做了歸類(lèi)透葛,并對(duì)應(yīng)實(shí)現(xiàn)了生產(chǎn)該類(lèi)產(chǎn)品工廠類(lèi)笨使。
此時(shí)的工廠類(lèi)與工廠方法模式下的工廠類(lèi)的主要區(qū)別在于,這種工廠類(lèi)并不局限于創(chuàng)建某個(gè)特定類(lèi)的產(chǎn)品僚害,而是根據(jù)需要可以創(chuàng)建具體類(lèi)型不同的產(chǎn)品硫椰。
何時(shí)使用抽象工廠:
1、通過(guò)對(duì)象組合創(chuàng)建抽象產(chǎn)品萨蚕。
2靶草、創(chuàng)建多系列產(chǎn)品
抽象工廠模式是對(duì)象的創(chuàng)建模式,它是工廠方法模式的進(jìn)一步推廣岳遥。
工廠模式總結(jié):
應(yīng)用場(chǎng)景:
1.在設(shè)計(jì)的初期奕翔,就考慮到產(chǎn)品在后期會(huì)進(jìn)行大規(guī)模擴(kuò)展的情況下,應(yīng)當(dāng)使用工廠方法模式浩蓉;
2.產(chǎn)品結(jié)構(gòu)較復(fù)雜的情況下派继,建議使用工廠方法模式宾袜;
3.工廠方法模式適用于產(chǎn)品種類(lèi)結(jié)構(gòu)單一的場(chǎng)合,為一類(lèi)產(chǎn)品提供創(chuàng)建的接口驾窟;
4.而抽象工廠方法適用于產(chǎn)品種類(lèi)結(jié)構(gòu)多的場(chǎng)合庆猫,主要用于創(chuàng)建一組(有多個(gè)種類(lèi))相關(guān)的產(chǎn)品,為它們提供創(chuàng)建的接口绅络;就是當(dāng)具有多個(gè)抽象角色時(shí)月培,抽象工廠便可以派上用場(chǎng)。
5.至于簡(jiǎn)單工廠模式恩急,適合類(lèi)型單一杉畜,但是多個(gè)場(chǎng)合下頻繁創(chuàng)建銷(xiāo)毀的情況,當(dāng)后期需要大規(guī)模擴(kuò)展時(shí)衷恭,不適宜使用簡(jiǎn)單工廠模式此叠。