单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
主要优点:
- 提供了对唯一实例的受控访问。
- 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
- 允许可变数目的实例。
主要缺点:
- 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
- 单例类的职责过重,在一定程度上违背了“单一职责原则”。
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
给HSCommonTool类设定单例模式
#import <Foundation/Foundation.h>
@interface HSCommonTool : NSObject
+ (instancetype)sharedCommonTool;
@end
#import "HSCommonTool.h"
@interface HSCommonTool()<NSCopying>
@end
@implementation HSCommonTool
// 定义一个静态变量
static HSCommonTool *_commonTool;
// 重写allocWithZone方法,alloc内部调用次方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
// 设定allocWithZone只执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_commonTool = [super allocWithZone:zone];
});
return _commonTool;
}
// copy对象时,调用此方法
- (id)copyWithZone:(nullable NSZone *)zone
{
return _commonTool;
}
// 写个类方法,方便外界调用
+ (instancetype)sharedCommonTool
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_commonTool = [[self alloc] init];
});
return _commonTool;
}
@end
单例模式的封装 - HSSingleton.h
// .h文件
#define HSGSingletonH(name) + (instancetype)shared##name;
// .m文件
#define HSGSingletonM(name) \
static id _instance; \
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instance; \
}

776

被折叠的 条评论
为什么被折叠?



