单例模式

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

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


                                    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;
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值