设计模式-单例模式的实现

2016-08-25  本文已影响21人  yanhooIT

前言

完整代码

static id _instance;// 全局的static的实例,直到程序退出才被销毁

/**
 *  控制只分配一份内存空间,alloc方法会调用这个方法来分配内存
 */
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^ {
        _instance = [super allocWithZone:zone];
    });

    return _instance;
}

/**
 *  提供一个类方法供外界快速获取单例对象
 */
+ (instancetype)sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^ {
        _instance = [[self alloc] init];
    });

    return _instance;
}

/**
 *  控制拷贝对象也是同一个示例,可以不遵守<NSCopying>协议
 */
- (id)copyWithZone:(NSZone *)zone {
    return _instance;
}

抽取成宏方便以后快速实现单例模式

// .h文件
#define YHSingletonH(name) + (instancetype)shared##name;

// .m文件
#define YHSingletonM(name) \
/**
*  全局的static的实例,直到程序退出才被销毁
*  使用static可以让外界不能访问_instance全局变量
*/\
static id _instance;\
\
/**
 *  控制只分配一份内存空间
 */\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
    static dispatch_once_t onceToken;\
    dispatch_once(&onceToken, ^\
                  {\
                      _instance = [super allocWithZone:zone];\
                  });\
    \
    return _instance;\
}\
\
/**
 *  提供一个类方法供外界快速获取单例对象
 */\
+(instancetype)shared##name\
{\
    static dispatch_once_t onceToken;\
    dispatch_once(&onceToken, ^\
                  {\
                      _instance = [[self alloc] init];\
                  });\
    return _instance;\
}\
\
/**
 *  控制拷贝对象也是同一个示例,可以不遵守<NSCopying>协议
 */\
-(id)copyWithZone:(NSZone *)zone\
{\
    return _instance;\
}\

著名的双锁技术实现单例

// 著名的双锁技术
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    if (_instance == nil)
    {
        @synchronized(self)
        {
            if(_instance == nil)
            {
                _instance = [super allocWithZone:zone];
            }
        }
    }

    return _instance;
}
@implementation XXXClass

static NSLock *_lock;
+(void)initialize
{
    //初始化锁对象
    _lock = [[NSLock alloc]init];
}

// 著名的双锁技术
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    if (_instance == nil)
    {
        // 加锁
        [_lock lock];
        if(_instance == nil)
        {
            _instance = [super allocWithZone:zone];
        }
        // 解锁
        [_lock unlock];
    }

    return _instance;
}
上一篇下一篇

猜你喜欢

热点阅读