設計模式 —— 單例模式(唯一性)

設計模式 —— 單例模式

原理:系統中的類只有一個實例,且易於外界訪問

系統中的單例
[[UIApplication sharedApplication] statusBarStyle];
    
[[NSNotificationCenter defaultCenter] addObserver:<#(nonnull id)#> selector:<#(nonnull SEL)#> name:<#(nullable NSNotificationName)#> object:<#(nullable id)#>];
    
[[NSUserDefaults standardUserDefaults] objectForKey:<#(nonnull NSString *)#>];
    
[NSFileManager defaultManager]

如何保證只創建一次:

1、防止繼承;

2、保證只能創建一次(主要是解決alloc init問題)

static ManagerCenter *center = nil;

+ (instancetype)managerCenter {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        center = (ManagerCenter *)@"ManagerCenter";
        center = [[ManagerCenter alloc] init];
    });
    //防止子類繼承,直接崩潰
    NSString *classStr = NSStringFromClass([self class]);
    if (![classStr isEqualToString:@"ManagerCenter"]) {
        NSParameterAssert(nil);
    }
    return center;
}
- (instancetype)init {
    //防止init方法創建單例
    NSString *classStr = (NSString *)center;
    if ([classStr isKindOfClass:[NSString class]] == YES && [classStr isEqualToString:@"ManagerCenter"]) {
        
        self = [super init];
        if (self) {
            //防止子類init方法繼承
            NSString *classStr = NSStringFromClass([self class]);
            if (![classStr isEqualToString:@"ManagerCenter"]) {
                NSParameterAssert(nil);
            }
        }
        return self;
    } else {
        return nil;
    }
}

解決的問題:

優化本地存儲:FastCoding

注: 消除.m warning -fno-objc-arc

- (void)storeValue:(id)value withKey:(NSString *)key {
    
    NSParameterAssert(value);
    NSParameterAssert(key);
    
    NSData *data = [FastCoder dataWithRootObject:value];
    if (data) {
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
    }
}
- (id)valueWithKey:(NSString *)key {
    
    NSParameterAssert(key);
    NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:key];
    return [FastCoder objectWithData:data];
}

使用分類優化存儲過程

@interface NSObject (StoreValue)

- (void)storeValueWithKey:(NSString *)key;
+ (id)valueWithKey:(NSString *)key;

@end
#import "NSObject+StoreValue.h"
#import "ManagerCenter.h"

@implementation NSObject (StoreValue)

- (void)storeValueWithKey:(NSString *)key {
    
    [[ManagerCenter managerCenter] storeValue:self withKey:key];
    
}
+ (id)valueWithKey:(NSString *)key {
    
    return [[ManagerCenter managerCenter] valueWithKey:key];
}

@end

存儲直接調用

[self.typeOne storeValueWithKey:@"FastCoding"];
TypeTwoMediator *model = [TypeTwoMediator valueWithKey:@"FastCoding"];
NSLog(@"%f",model.colleagueA.value);

優缺點: 優:共享信息,管理中心;缺:破壞了封裝性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章