数学逻辑中,singleton定义为“有且仅有一个元素的集合”
- 何为单例模式:
单例类:在面对对象的应用程序下,用工厂方法(静态类方法)限制实例化过程,让其总是返回自己的同一个单例的对象类。
单例模式:,也就是说在一个系统中,保证一个类仅有一个实例,并提供一个访问它的全局访问点的设计模式。
- 何时单例模式
(1)思考:
全局对象:全局变量保持对类的实例的唯一引用,实际上访问这个全局变量的类或者方法共享着同一份副本资源。但是团队的其他人定义了相同类型的静态变量,那么程序会出现两个相同的全局对象。
类方法:提供了共享的服务,不用创建对象就可以访问。资源的唯一变量在类方法中去维护,不利于为子类化服务,不够灵活。
总结:静态的全局对象引用和类方法提供的全局访问点,无法防止类被实例化多次,同时类方法缺少消除耦合的灵活性。
(2)何时使用:
- 类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如:类方法。
- 唯一的实例只能通过子类进行拓展,不破坏客户端的代码。
业务场景:在整个程序中,一个类只允许有一个实例,在整个程序中需要多次使用,共享同一份资源的时候。
三.单例优缺点
优点: 因为单例模式会使类只有一个实例所以方便使用,并且节省内存资源的分配.因为使用GCD的方式是线程安全的,所以会避免资源的多重使用
缺点: 单例创建的内存只有在程序结束时才会被释放. 由于单例不能被继承(因为返回的是同一个实例),所以扩展性很不好。
- OC中的实现
(1)不严格使用
观察实例对象:
结果:实例化后不是同一个实例
总结:①发起调用的对象(calling object)不能以其他分配方式实例化单例对象,否则可能创建单例类的多个实例
②对单例对象实例化的限制应该与引用计数模型共存
(2)严格方式
重载所有的实例化方法:
保持引用计数模型不改变:
观察实例对象:
结果:实例化后都是同一个实例
(3)子类化Singleton
因为Singleton重载了所有的实例化相关的方法,所以直接不做修改就子类化Sinleton,返回的实例总是Singleton本身。
解决方法:
+(Singleton *)sharedInstance
{
if(_sharedSingleton_==nil){
_sharedSingleton = [NSAllocateObject([Singleton class],0,NULL) init];
}
return _sharedSingleton_;
}
第一个参数是类型,第二个参数是用于索引实例变量的额外字节数总是0,第三个参数用于指定内存中分配的区域一般为NULL表示默认区域。可以通过指定类的类型,用这个函数实例化任何对象。
(4)线程安全
参考书籍:《objective-C编程之道:ios设计模式解析》