今天去面試,對方公司給的試卷中有一道題是寫單例模式,面試的時候也問了我單例模式的優缺點。老實說回答得相當不好,對方也指出了我代碼中的不嚴謹。回來自己從新查找了一下資料,重新總結了一下。
主要優點:
1、提供了對唯一實例的受控訪問。
2、由于在系統內存中只存在一個對象,因此可以節約系統資源,對于一些需要頻繁創建和銷毀的對象單例模式無疑可以提高系統的性能。
3、允許可變數目的實例。
主要缺點:
1、由于單利模式中沒有抽象層,因此單例類的擴展有很大的困難。
2、單例類的職責過重,在一定程度上違背了“單一職責原則”。
3、濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如果實例化的對象長時間不被利用,系統會認為是垃圾而被回收,這將導致對象狀態的丟失.
以下是相對嚴謹的做法
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCopying, NSMutableCopying>
+ (instancetype)sharePerson;
@end
#import "Person.h"
//全局
static Person *_person;
@implementation Person
//初始化方法
- (instancetype)init{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [super init];
});
return _person;
}
//單例方法
+ (instancetype)sharePerson{
return [[self alloc] init];
}
//alloc會調用allocWithZone,確保使用同一塊內存地址
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [super allocWithZone:zone];
});
return _person;
}
//copy的時候會調用copyWithZone
- (id)copyWithZone:(NSZone *)zone{
return _person;
}
+ (id)copyWithZone:(struct _NSZone *)zone{
return _person;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
return _person;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
return _person;
}
Person *person1 = [[Person alloc]init];
Person *person2 = [Person sharePerson];
Person *person3 = [[Person alloc]init];
Person *person4 = [person3 mutableCopy];
Person *person5 = [person4 copy];
NSLog(@"%p %p %p %p %p", person1, person2, person3, person4, person5);
// 0x170001ad0 0x170001ad0 0x170001ad0 0x170001ad0 0x170001ad0