单例模式

来源:互联网 发布:linux 图形安装 kvm 编辑:程序博客网 时间:2024/04/30 19:29

单例模式是指系统中的一个类只有一个实例,并提供一个访问它的全局方法,常用的方法是将创建这个实例的操作隐藏在一个类操作中(即一个静态成员函数或者是一个类方法)

这个类可以保证没有其他实例可以被创建(通过截取创建对象的请求)


                                    UML图

创建单例

方法一:

+ (instancetype)managerCenter {    static UserInfoManagerCenter *center = nil;        if (center == nil) {                center = [[UserInfoManagerCenter alloc] init];    }        return center;}
缺点:如果多个地方同时调用这个函数,当同时进入这个函数的时候,center这个实例为空,会导致同时创建多个实例化类


方法二:

通过使用队列使请求不同时发生

+ (instancetype)managerCenter {        static UserInfoManagerCenter *center = nil;        static dispatch_once_t predicate;    dispatch_once(&predicate, ^{            center = [[UserInfoManagerCenter alloc] init];    });        return center;}

编写更加严格的单例

1.防止其它的类调用创建单例的方法

2.防止通过调用init方法来创建类

+ (instancetype)managerCenter {        static dispatch_once_t predicate;    dispatch_once(&predicate, ^{            center = (UserInfoManagerCenter *)@"UserInfoManagerCenter";        center = [[UserInfoManagerCenter alloc] init];    });        // 防止子类使用    NSString *classString = NSStringFromClass([self class]);    if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) {                NSParameterAssert(nil);    }        return center;}- (instancetype)init {        NSString *string = (NSString *)center;    if ([string isKindOfClass:[NSString class]] == YES && [string isEqualToString:@"UserInfoManagerCenter"]) {                self = [super init];   //通过调用[[UserInfoManagerCenter alloc] init]方法直接实例化变量返回nil        if (self) {                        // 防止子类使用            NSString *classString = NSStringFromClass([self class]);            if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) {                                NSParameterAssert(nil);            }        }                return self;            } else {            return nil;    }}





0 0