单例模式的解析-iOS

xiaoxiao2021-02-28  25

单例模式的解析-iOS

其他设计模式的介绍

1、简单工厂模式、工厂模式、抽象工厂模式的解析-iOS 2、建造者模式的解析-iOS 3、单例模式的解析-iOS 4、原型模式的解析-iOS 5、代理模式的解析-iOS 6、适配器模式的解析-iOS 7、装饰器模式的解析-iOS 8、外观模式的解析-iOS 9、桥接模式的解析-iOS 10、组合模式的解析-iOS

概率描述

保证一个类仅有一个实例,并提供一个访问它的全局访问点。百度百科

实用场景

1、需要经常创建和销毁的实例对象。 2、经常使用到的,创建的时候会消耗资源过多的。 3、经常使用到的,创建的时候会很耗时的。 4、一些有状态的工具类。

单利创建的几种方式

1、传统方法

//传统方式 -(instancetype)traditionSingleton{ static SimpleFeedBack *singleton = nil; if (singleton == nil){ singleton = [[SimpleFeedBack alloc] init]; } return singleton; }

2、GCD方式

//GCD方式 -(instancetype)gcdSingleton{ static SimpleFeedBack *singleton = nil; //给单例加了一个线程锁 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ singleton = [[SimpleFeedBack alloc] init]; }); return singleton; }

3、加锁方式

//加锁方式 +(SimpleFeedBack*)singleton { static SimpleFeedBack* singleton; @synchronized(self) { if (!singleton) { singleton = [[SimpleFeedBack alloc] init]; } return singleton; } return nil; }

案例解析

我们就以我们音乐app里面的统计数据的工具类。这个是符合我们适用场景里面的第4个情况,有状态的工具类;这个类每个需要用到网络的页面都需要使用,所以也符合我们的第1条,需要频繁创建和和销毁的实例对象。 我们来看一下具体的代码:

+(FeedBack*)singleton { static FeedBack* singleton; @synchronized(self) { if (!singleton) { singleton = [[FeedBack alloc] init]; } return singleton; } return nil; } - (id)init { self = [super init]; if (self) { @synchronized(self) { //在这里面做一些初始化的操作,init方法自己可以定制。 } } return self; }

优缺点

优点 1、单利会阻止其他的对象对自己实例化,在内存中只保存一份实例对象。保证了对唯一实例的受控访问。 2、在内存中只存在一份实例,节省创建多个实例,从而节省的系统的资源

缺点 1、往往我们使用的单利模式,在通常情况下,都不可能只一项职责,都是多项职责,这样在一定程度上面就违法了“单一职责的原则”。 2、单利类的扩展很难,因为单利没有抽象层,所以在一定程度上扩展很难 3、因为单利是一直存在内存里面的,如果该单利长时间不使用,他会被系统认为是垃圾而被回收,可能导致我们之前设置的一些状态被丢失掉。 4、会导致内存溢出。

总结

如果有写的不正确或者侵权的,希望大家给我提出来,我会及时修改。谢谢大家。

转载请注明原文地址: https://www.6miu.com/read-2799974.html

最新回复(0)