单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
优点
在项目中使用方便,且节省资源,整个项目就一个实例,一般用于通用功能使用。
缺点
单例模式只有在程序关闭后才释放,在很多情况不在使用,也是一种资源占用的浪费。
总结
单例模式是一个非常有用的模式,适合在整个程序生命周期都需要存在的时候使用,但是单例模式职责不应该过多,如果占用资源过多会导致资源浪费。
项目地址:https://github.com/GameRisker/Study-Design-Patterns.git
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// // Signleton.h // Singleton // // Created by GameRisker on 2016/10/30. // Copyright © 2016年 GameRisker. All rights reserved. // #import <Foundation/Foundation.h> @interface Signleton : NSObject + (instancetype) getInstance; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// // Signleton.m // Singleton // // Created by GameRisker on 2016/10/30. // Copyright © 2016年 GameRisker. All rights reserved. // #import <Foundation/Foundation.h> #import "Signleton.h" @implementation Signleton static Signleton *_Instance = nil; +(instancetype) getInstance { static dispatch_once_t oncetaken; dispatch_once(&oncetaken,^{ _Instance = [[self alloc]init]; }); return _Instance; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// // main.m // Singleton // // Created by GameRisker on 2016/10/30. // Copyright © 2016年 GameRisker. All rights reserved. // #import <Foundation/Foundation.h> #import "Signleton.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... Signleton * obj1 = [Signleton getInstance]; NSLog(@"obj1 : %@",obj1); Signleton * obj2 = [Signleton getInstance]; NSLog(@"obj2 : %@",obj2); Signleton * obj3 = [[Signleton alloc]init]; NSLog(@"obj3 : %@",obj3); } return 0; } |