单例模式

 

数学逻辑中,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设计模式解析》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值