單例設計模式是開發中經常會被用到的一種設計模式,而且有時候一個項目中會用到多個不同的單例,但是重復的編寫創建單例的代碼就會顯得比較麻煩。如果我們將創建單例的代碼以宏的形式定義出來,只需要簡單的兩句就能實現單例的聲明和實現,就可以很容易的避免上面的麻煩.下面講一下怎么實現宏定義單例.
步驟一
我們先創建一個頭文件,將下面的代碼聲明到這個頭文件中:
//聲明單例實現入口
#define Singleton_InterFace(singletonName) \
+ (id)shared##singletonName;
//創建單例實現方法
#define Singleton_Implemention(singletonName) \
static id _singletonInstance = nil; \
+ (id)shared##singletonName \
{ \
return [[self alloc] init]; \
} \
+ (id)allocWithZone:(NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_singletonInstance = [super allocWithZone:zone]; \
}); \
return _singletonInstance; \
} \
- (id)copyWithZone:(NSZone *)zone { \
return _singletonInstance; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return self; \
} \
步驟二
按照步驟一將單例的實現方法以宏的方式定義出來,下面就調用聲明好的宏方法:
1.在.h中調用Singleton_InterFace(DataBaseManager);
#import <Foundation/Foundation.h>
#import "xxx.h"http://定義宏單例的頭文件
@interface HYDataBaseManager : NSObject<NSCopying, NSMutableCopying>
Singleton_InterFace(DataBaseManager);
@end
2.在.m中調用Singleton_Implemention(DataBaseManager);
#import "HYDataBaseManager.h"
@implementation HYDataBaseManager
Singleton_Implemention(DataBaseManager);
@end
步驟三
上面兩步以及完成后,接下來我們就來驗證一下單例是否正的能創建成功:
//調用下面的方法
- (void)singletonTest {
HYDataBaseManager *dataBaseManager1 = [HYDataBaseManager shareDataBaseManager];
HYDataBaseManager *dataBaseManager2 = [HYDataBaseManager shareDataBaseManager];
NSLog(@"Manager1 == %@", dataBaseManager1);
NSLog(@"Manager2 == %@", dataBaseManager2);
}
打印輸出:
2017-11-28 10:49:39.070465+0800 GCD[1670:75187] Manager1 == <HYDataBaseManager: 0x604000017790>
2017-11-28 10:49:39.070701+0800 GCD[1670:75187] Manager2 == <HYDataBaseManager: 0x604000017790>
從控制臺的輸出可以看出Manager1和Manager2是同一個對象,所以單例創建成功.
引申: 系統提供的單例設計模式大都是以shared開頭,那么我們的寫法應該遵循系統的這種命名規范,##就是一個連接符,會將singletonName變量的值拼接在shared后面形成一個方法名,每行末尾的"\"也是C語音的一個連接符.注意,每行之間不能用空行,否則編譯的時候會報錯,若果需要空行,需要在空行處添加"\"。