单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。单例是一种重要的概念,它是一种极其便利的设计模式。
如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。单态模式在Java、C++中很常用,在iOS开发中,单例也是非常有用的设计模式之一。它是在代码间共享数据而不需要手动传递参数的一种最有用的方法。
单例模式设计:
WFSingle.h头文件
#import <Foundation/Foundation.h>
@interface WFSingle : NSObject
@property (nonatomic, assign) NSUInteger max;
+ (instancetype) sharedSingle;
@end
WFSingle.m实现文件
#import "WFSingle.h"
@implementation WFSingle
- (instancetype)init{
@throw [NSException exceptionWithName:@"异常" reason:@"单例不允许调该方法" userInfo:nil];
}
+ (instancetype) sharedSingle{
static WFSingle *single;
if (single == nil) {
@synchronized(self){
if (single == nil) {
single = [[WFSingle alloc] initPrivate];
}
}
}
return single;
}
- (instancetype) initPrivate{
if (self = [super init]) {
_max = 1000000;
}
return self;
}
@end
这样就实现了一个单例模式的类。在单例类中首先要将类的初始化方法设为调用时抛出异常,并不能返回一个对象,这样外界就不能调用init()方法来创建对象了。在类外只能通过单例类的类方法sharedSingle()方法得到一个对象,无论类外调用多少次得到的都是同一个对象。
#import <Foundation/Foundation.h>
#import "WFSingle.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
WFSingle *single1 = [WFSingle sharedSingle];
WFSingle *single2 = [WFSingle sharedSingle];
//无论创建多少个对象指针,都是指向同一个对象
NSLog(@"%@",single1);
NSLog(@"%@",single2);
}
return 0;
}
2016-04-15 17:48:02.207 singleModle[4335:355082] <WFSingle: 0x100114670>
2016-04-15 17:48:02.209 singleModle[4335:355082] <WFSingle: 0x100114670>
由此可见打印的两个类型的指针地址是相同的,即同一个对象。这就是所谓的单例模式。