單例
單例使用懶加載方式在第一次實例時創(chuàng)建道逗,如[NSUserDefaults standardUserDefaults]紧显,[UIApplication sharedApplication]智嚷,[UIScreen mainScreen]馍悟,[NSFileManager defaultManager]
系統(tǒng)的單例類
UIApplication
NSNotificationCenter
NSFileManager
NSUserDefaults
NSURLCache
NSHTTPCookieStorage
@interfaceLibraryAPI :NSObject+ (LibraryAPI*)sharedInstance;@end+ (LibraryAPI*)sharedInstance? {// 聲明一個靜態(tài)變量去保存類的實例狮含,確保它在類中的全局可用staticLibraryAPI *_sharedInstance =nil;// dispatch_once_t確保初始化器只執(zhí)行一次staticdispatch_once_toncePredicate;// 單例的關(guān)鍵柒傻,一旦類被初始化孝赫,初始化器不會再被調(diào)用dispatch_once(&oncePredicate, ^{? ? ? ? ? _sharedInstance = [[LibraryAPI alloc] init];? ? ? });return_sharedInstance;? }
@implementationXNShareTool/**
步驟:
1.一個靜態(tài)變量_inastance
2.重寫allocWithZone, 在里面用dispatch_once, 并調(diào)用super allocWithZone
3.自定義一個sharedXX, 用來獲取單例. 在里面也調(diào)用dispatch_once, 實例化_instance
-----------可選------------
4.如果要支持copy. 則(先遵守NSCopying協(xié)議)重寫copyWithZone, 直接返回_instance即可.
*//**第1步: 存儲唯一實例*/staticXNShareTool*_instance;/**第2步: 分配內(nèi)存孔家時都會調(diào)用這個方法. 保證分配內(nèi)存alloc時都相同*/+(id)allocWithZone:(struct_NSZone*)zone{//調(diào)用dispatch_once保證在多線程中也只被實例化一次staticdispatch_once_tonceToken;dispatch_once(&onceToken, ^{? ? ? ? ? _instance = [superallocWithZone:zone];? ? ? });return_instance;? }/**第3步: 保證init初始化時都相同*/+(instancetype)sharedTool{staticdispatch_once_tonceToken;dispatch_once(&onceToken, ^{? ? ? ? ? _instance = [[XNShareToolalloc] init];? ? ? });return_instance;? }/**第4步: 保證copy時都相同*/-(id)copyWithZone:(NSZone*)zone{return_instance;? }@end
門面模式Facade
暴露接口
裝飾器模式Decorator
常見的實現(xiàn)是Category和Delegation,
適配器模式Adapter
包裝一個對象暴露一個標(biāo)準(zhǔn)的接口红符∏啾可以使用協(xié)議的方式實現(xiàn),比如UITableViewDelegate预侯,UIScrollViewDelegate致开,NSCoding和NSCopying協(xié)議。
觀察者模式Observer
Notifications和Key-Value Observing(KVO)都是這個設(shè)計模式
備忘錄模式Memento
比如NSUserDefaults萎馅,或者用類似的方式進(jìn)行狀態(tài)保存使得再次進(jìn)入時能夠和離開時一樣双戳。可以使用UIApplicationDidEnterBackgroundNotification 這個通知去保存狀態(tài)糜芳。
命令模式
通過Target-Action機制和Invocation實現(xiàn)命令模式
MVVM?
在 MVVM 中飒货,view 和 view controller 正式聯(lián)系在一起,我們把它們視為一個組件
view 和 view controller 都不能直接引用 model峭竣,而是引用視圖模型
view model 是一個放置用戶輸入驗證邏輯塘辅,視圖顯示邏輯,發(fā)起網(wǎng)絡(luò)請求和其他代碼