Objective-C中对注册式单例模式(Register of Singletons)的简单实现

185 阅读1分钟

单例模式所有人都不陌生,在一些业务场景下,需要继承某个单例的子类实现一些额外的逻辑,这时候可以利用注册式的方式来实现单例。

@implementation Singleton

+ (instancetype) sharedInstance
{
    return [self sharedInstance:self];
}

+ (instancetype) sharedInstance:(Class)cls
{
    static Singleton* instance;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        instance = [[cls alloc] init];
    });
    return instance;
}

@end

实现一个单例类的子类

@interface ChildSingleton : Singleton
@end

测试代码:

ChildSingleton *childSingleton = [ChildSingleton sharedInstance];
Singleton *singleton = [Singleton sharedInstance];
NSLog(@"%x", &childSingleton);
NSLog(@"%x", &singleton);

输出结果:

2017-02-23 11:42:07.673 SingletonDemo[14675:26368323] a596c20
2017-02-23 11:42:07.673 SingletonDemo[14675:26368323] a596c20

需要注意的是,需要使用子类来第一次初始化单例。 可以在子类load方法中来初始化单例,以保证即使以父类类名去调用获取的也是子类的实例。