主要有三大分類:
3個創造型:單例、工廠模式、抽象工廠模式
4個動作型:觀察者模式、備忘錄模式、責任鏈模式和命令模式
5個結構型:MVC、裝飾器模式、適配器模式、外觀模式和組合模式
經常用的,MVC、單例、觀察者
一、單例
什么是單例?確保程序運行期某個類,只有一份實例,用于進行資源共享
常見的
- [NSUserDefaults standardUserDefaults]
- [UIApplication sharedApplication]
- [UIScreen mainScreen]
- [NSFileManager defaultManager]
如何創建?新建一個Singleton類,具體代碼如下:
//Singleton.h
@interface Singleton : NSObject
+ (Singleton *)sharedSingleton;
@end
/***************************************************************/
//Singleton.m
#import "Singleton.h"
@implementation Singleton
static Singleton *sharedSingleton = nil;
+ (Singleton *)sharedSingleton{
static dispatch_once_t once;
dispatch_once(&once,^{
sharedSingleton = [[self alloc] init];
//dosometing
});
return sharedSingleton;
}
二、觀察者模式
而在IOS開發中我們可能會接觸到的經典觀察者模式的實現方式,有這么幾種:NSNotificationCenter、KVO、Delegate等
//1.添加一個觀察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notifiChange) name:(UI對象有的事件,例如文本框值改變UITextFieldTextDidChangeNotification) object:nil];
//2.dealloc方法中注銷掉
[[NSNotificationCenter defaultCenter] removeObserver:self];}
//3.實現通知方法,notifiChange
三、MVC模式
通過數據模型,控制器邏輯,視圖展示將應用程序進行邏輯劃分
四、代理模式
當一個類的某些功能需要由別的類來實現,但是又不確定具體會是哪個類實現。
怎樣寫一個代理設計模式
1. 你要明確你的協議名稱,一般來講名稱都是:類名 + Delegate
2. 代理方法中一般都是聲明為@optional(程序默認情況下是@required)
3. 代理方法名一般以類名開頭
4. 代理方法至少有一個參數
具體實現:
CJPerson.h文件
@class CJPerson;
//1定義一個代理協議
@protocol CJPersonDelegate <NSObject>
@optional
- (void)findHourse:(CJPerson *)person;
@end
@interface CJPerson : NSObject
@property (nonatomic,copy)NSString *name;
//2定義一個代理屬性
@property (nonatomic,weak)id <CJPersonDelegate> delegate;
-(void)zuFang;
@end
CJPerson.m文件
#import "CJPerson.h"
@implementation CJPerson
-(void)zuFang{
//在某個方法中,調用代理的方法
//3判斷我的代理有沒有該方法實現,有則執行
if ([self.delegate respondsToSelector:@selector(findHourse:)]) {
[self.delegate findHourse:self];
}
}
@end
五、工廠模式
個人理解,工廠,主要生產產品的,在ios中,產品就是對象,換句話說,工廠模式就是為了生產創建對象的。
先引入幾個關鍵詞,封裝、工具類
蘋果有一個產品iphone5s,大家都知道吧,
[AappleFactory createIphone];
現在要生產5s,一般我們創建對象就是用alloc init的方法,例如下面
Iphone *p1=[[Iphone alloc]init]];
p1.name =@“5s”;
Iphone *p2=[[Iphone alloc]init]];
p2.name =@“5s”;
Iphone *p3=[[Iphone alloc]init]];
p3.name =@“5s”;
Iphone *p4=[[Iphone alloc]init]];
p4.name =@“5s”;
Iphone *p5=[[Iphone alloc]init]];
p5.name =@“5s”;
...
Iphone *p18=[[Iphone alloc]init]];
p18.name =@“5s”;
//或許你會以為一個for循環可以搞定,當初我也是這么想的,但是你想過沒有,它們不在同一個類中呢,例如以上18個實例,代表蘋果18家代工廠,它們在不同地方,分別生產iphone。
5s出來了,然后是iphone6,好吧,修改上面18行代碼,繼續生產,
然后iphone6s,出來了,你還是得在18個類里面修改那18行代碼。累不?
然后引入工廠模式
新建一個工廠類,也叫工具類。
AppleFactory.h
@interface AppleFactory:NSObject
+(Iphone *)createIphone;
@end
***
AppleFactory.m實現
+(Iphone *)createIphone{
[ Iphone * createIphone = [Iphone alloc] init];
Iphone.name = @"iphoneSe";
return Iphone;
}
Iphone *p1=[AppleFactory createIphone];
Iphone *p2=[AppleFactory createIphone];
Iphone *p3=[AppleFactory createIphone];
Iphone *p4=[AppleFactory createIphone];
Iphone *p5=[AppleFactory createIphone];
...
Iphone *p18=[AppleFactory createIphone];
現在出了iphoneSe,用工廠模式的話,就不需要修改18行代碼了,直接在工廠類的方法中修改一行就可以了。
總結一下,就是把方法封裝到一個工廠類中,或者說工具類中的。方便在多個地方重用,易于維護和修改。
工廠模式有三個術語:簡單工廠、工廠方法、抽象工廠。
簡單工廠模式的工廠類一般是使用靜態方法,通過接收的參數的不同來返回不同的對象實例。
工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠實例來創建不同的產品實例。
抽象工廠是應對產品族概念的。比如說,蘋果公司可能要同時生產iphone、ipad,那么每一個工廠都要有創建iphone,和ipad的方法。
三者的區別:
簡單工廠:工廠可以創建同一系列的產品,產品的接口一致,但工廠就要根據參數進行判斷到底創建哪種產品。(舉例例子,個人理解,例如深圳華強北工廠,你給它傳參數,給它一部iphone5s,它可以幫你改成iphoneSE。)
工廠方法:可以有多種工廠,工廠有共同的接口,一個工廠只能產生一種產品,比起簡單工廠,工廠方法就不需要判斷,耦合度低了不少。
抽象工廠:可以產生多個系列的產品,有2個維度的產品