ios設計模式2016

主要有三大分類:
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個維度的產品

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,978評論 1 15
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • 一、設計模式的分類 總體來說設計模式分為三大類: 創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者...
    RamboLI閱讀 772評論 0 1
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 前幾天看到小伙伴群里發的吳軍老師的得到專欄文章-“第351封信|卡尼曼的經濟學課(中):為什么自己的孩子越看越愛”...
    翻滾吧橘子閱讀 220評論 0 0