看过很多大公司的面试,常被要求设计一个单例,所以查了一些网上文档和一些书籍,现在整理一下分享给大家:
在以下情况下,应该考虑使用单例模式:
1.类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如说工厂方法
2.这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码
如何设计一个单例模式的类
1.首先必须创建一个全局实例,通常存放在一个全局变量中,此全局变量设置为nil (Singleton是建的的单例类)
static Singleton *shareSingleton = nil;
2.提供工厂方法对该全局实例进行访问,检查该变量是否为nil,如果为nil就创建一个新的实例,最后返回全局实例
+ (Singleton *) shardInstance
{
if (shardSingleton == nil) {
shardSingleton = [[super allocWithZone:NULL] init];
}
return shardSingleton;
}
3.全局变量的初始化在第一次调用工厂方法时会在:+allocWithZone中进行,所以需要重写该方法,防止通过标准的alloc方法来创建新的实例
+ (id)allocWithZone:(struct _NSZone *)zone
{
return [[self shardInstance] retain];
}
4.为了防止通过copy方法得到新的实例,需要重写copyWithZone方法
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
只需在此方法中返回本身即可,引用计数也不需要改变,因为单例设计模式下的对象是不允许销毁的,所以也就不用保留
5.因为全局实例是不允许释放的,所以retain,release,autorelease方法均需重写
- (id) retain
{
return self;
}
- (id) release
{
//什么也不做
}
- (NSInteger) retainCount
{
return NSUIntegerMax;
}
- (id) autorelease
{
return self;
}
这样整个单例模式就设计完啦