13、单例模式

来源:互联网 发布:英语造句软件下载 编辑:程序博客网 时间:2024/06/02 02:40

单例设计模式

·基本概念

单例设计模式运用较为普遍、广泛且较为简单的设计模式之一,它的设计原理是:始终返回一个实例,即一个类始终只有一个实例。
这里写图片描述

创建单例的基本步骤

·声明一个单件对象的静态实例,并初始化为nil。
·创建一个类的类工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时
·覆盖allocWithZone:方法,确保用户(程序员)在直接分配和初始化对象时,不会产生另一个对象。
·实现NScopying协议,覆盖release、autorelease、retain、retainCount方法, 以此确保单例的状态。
·在多线程的环境中,注意使用@synchronized关键字,确保静态实例被正确的创建 和初始化。

//UserContext.h#import <Foundation/Foundation.h>@interface UserContext : NSObject<NSCopying>@property(nonatomic,copy)NSString *userName;@property(nonatomic,copy)NSString *email;+ (id)shareUserContext;@end
//UserContext.m#import "UserContext.h"static UserContext *segtonInstance = nil;@implementation UserContext+ (id)shareUserContext {    @synchronized(self){        if (segtonInstance == nil) {            segtonInstance = [[[self class] alloc] init];        }    }    return segtonInstance;}#pragma mark - 下面的方法为了确保只有一个实例对象+ (id)allocWithZone:(NSZone *)zone {    if (segtonInstance == nil) {        segtonInstance = [super allocWithZone:zone];    }    return segtonInstance;}- (id)copyWithZone:(NSZone *)zone {    return segtonInstance;}- (id)retain {    return segtonInstance;}- (oneway void)release {}- (id)autorelease {    return segtonInstance;}- (NSUInteger)retainCount {    return UINT_MAX;}@end
#import <Foundation/Foundation.h>#import "UserContext.h"int main(int argc, const char * argv[]){    @autoreleasepool {        UserContext *userContext = [UserContext shareUserContext];        UserContext *userContext2 = [UserContext shareUserContext];        UserContext *userContext3 = [[UserContext alloc] init];        UserContext *userContext4 = [userContext copy];        [userContext release];        [userContext release];        [userContext release];        [userContext release];                NSLog(@"");    }    return 0;}
0 0