ARC环境下两种单例设计模式的比较:GCD和同步锁
2015-12-08 23:27
337 查看
A. 单例模式的设计思路:
(1)永远只分配一块内存来创建对象;
(2)提供一个类方法,返回内部唯一的实例;
(3)确保 init 方法只初始化一次;
(通常采用懒加载的方式在第一次用到实例的时候再去创建它。)
B. 单例模式的作用 :
可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。
C. 单例模式的使用场合:
在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),那就应该让这个类创建出来的对象永远只有一个。
D. 示例Demo:
#import <Foundation/Foundation.h>
@interface TextTool : NSObject
// 使用GCD实现单例
+(instancetype)sharedGCDTool;
// 使用同步锁实现单例
+(instancetype)sharedSynTool;
@end
#import "TextTool.h"
@implementation TextTool
// 使用GCD实现单例
+(instancetype)sharedGCDTool{
// 声明一个静态变量去保存类的实例,确保它在类中的全局可用性。
static id _instance;
// 声明一个静态变量dispatch_once_t ,它确保初始化器代码只执行一次
static dispatch_once_t onceToken;
// 使用Grand Central Dispatch(GCD)执行初始化 TextTool 实例的block,这是单例模式的关键:一旦类被初始化,初始化器永远不会再被调用。
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
// 使用同步锁实现单例
+(instancetype)sharedSynTool{
// 声明一个静态变量去保存类的实例,确保它在类中的全局可用性。
static TextTool *instance;
// 同步锁
@synchronized(self) {
if (instance == nil) {
instance = [[TextTool alloc] init];
}
}
return instance;
}
@end
#import "ViewController.h"
#import "TextTool.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self testDemo];
}
// 性能检测
-(void)testDemo{
double t1 = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 999 * 999; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[TextTool sharedGCDTool];
});
}
double t2 = CFAbsoluteTimeGetCurrent();
NSLog(@"GCD----> %f",t2 - t1);
//--------------------------华丽分割线----------------------------------------------
double t3 = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 999 * 999; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[TextTool sharedSynTool];
});
}
double t4 = CFAbsoluteTimeGetCurrent();
NSLog(@"Syn====> %f",t4 - t3);
}
@end
输出结果:
显然,使用GCD创建的单例,耗时最短,性能高出很多。
(1)永远只分配一块内存来创建对象;
(2)提供一个类方法,返回内部唯一的实例;
(3)确保 init 方法只初始化一次;
(通常采用懒加载的方式在第一次用到实例的时候再去创建它。)
B. 单例模式的作用 :
可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。
C. 单例模式的使用场合:
在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),那就应该让这个类创建出来的对象永远只有一个。
D. 示例Demo:
#import <Foundation/Foundation.h>
@interface TextTool : NSObject
// 使用GCD实现单例
+(instancetype)sharedGCDTool;
// 使用同步锁实现单例
+(instancetype)sharedSynTool;
@end
#import "TextTool.h"
@implementation TextTool
// 使用GCD实现单例
+(instancetype)sharedGCDTool{
// 声明一个静态变量去保存类的实例,确保它在类中的全局可用性。
static id _instance;
// 声明一个静态变量dispatch_once_t ,它确保初始化器代码只执行一次
static dispatch_once_t onceToken;
// 使用Grand Central Dispatch(GCD)执行初始化 TextTool 实例的block,这是单例模式的关键:一旦类被初始化,初始化器永远不会再被调用。
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
// 使用同步锁实现单例
+(instancetype)sharedSynTool{
// 声明一个静态变量去保存类的实例,确保它在类中的全局可用性。
static TextTool *instance;
// 同步锁
@synchronized(self) {
if (instance == nil) {
instance = [[TextTool alloc] init];
}
}
return instance;
}
@end
#import "ViewController.h"
#import "TextTool.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self testDemo];
}
// 性能检测
-(void)testDemo{
double t1 = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 999 * 999; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[TextTool sharedGCDTool];
});
}
double t2 = CFAbsoluteTimeGetCurrent();
NSLog(@"GCD----> %f",t2 - t1);
//--------------------------华丽分割线----------------------------------------------
double t3 = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 999 * 999; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[TextTool sharedSynTool];
});
}
double t4 = CFAbsoluteTimeGetCurrent();
NSLog(@"Syn====> %f",t4 - t3);
}
@end
输出结果:
显然,使用GCD创建的单例,耗时最短,性能高出很多。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- C#单例模式(Singleton Pattern)实例教程
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- 深入浅出23种设计模式
- 浅谈c#设计模式之单一原则
- C#设计模式之观察者模式实例讲解
- C#设计模式之单例模式实例讲解
- 学习JavaScript设计模式(接口)
- 深入理解JavaScript系列(28):设计模式之工厂模式详解
- 面向对象设计模式的核心法则