上篇博客我们系统的介绍了三种工厂模式,今天我们就来介绍一下单例模式。单例模式虽然简单,但是还是比较重要的,是常用设计模式之一。在之前的博客《Objective-C中的单例模式》中介绍了Objective-C中MRC和ARC下的单例模式。单例模式应该说是设计模式中最为简单的了,但是简单并不代表其不重要,在程序开发中单例模式的出镜率还是比较高的。举个栗子🌰,在用户登录你的应用后,你要存储一下用户的基本信息对吧,此时将用户的基本信息放在单例中是比较合适的。因为在这种场景下,当前登录的用户只有一个,而且需要信息统一,所以我们需要使用单例来实现。
“单例”顾明思议,就是单个实例。也就是说一个类在程序运行期间只能生成一个实例。进一步说,如果一个类未被实例过,那么在对类进行实例化的时候就创建一个实例。如果该类已经被实例化了,那么就不需要对该类进行实例化,直接拿过来之前实例化的对象使用即可。下方是单例的定义:
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
在Swift中实现单例也是比较简单的,同样你可以使用GCD进行单例的创建也可以使用静态方法和静态属性来实现。因为今天博客中的代码所涉及的内容只有一个类,在此就不做类图了。
一、使用GCD实现单例
GCD在Swift中用着也是非常爽的,下方代码段是使用GCD中的dispatch_once来实现的,使用方法可OC一直。下方代码当然是线程安全的,并且使用了类的静态属性和静态方法。在类下方紧跟着的是测试用例,对创建的两个常量进行地址的打印,我们发现地址是一致的,这就足以说明两个常量指向同一块内存地址。有一点需要注意的是我们需要将生成单例的类的构造函数(Swift中是init()函数)声明成private,这样就避免了外部用户直接使用期构造函数直接生成对象了。在GCD这种实现单例的方式中,如果你不将构造器声明称private类的的,那么是可以生成新的对象实例的。
代码和测试用例如下所示:

二、使用静态私有常量和静态方法来实现单例
如果你感觉使用dispatch_once来创建单例有些麻烦的话,那么你可以通过静态方法来返回静态私有常量的形式来创建单例。下方就是先创建了一个私有静态常量并分配值,然后在静态方法中对其进行返回。只要使用者调用sharedInstance()方法时,就会将staticInstance实例进行返回。当然使用这种方式来实现单例时同样需要将该类的构造方法声明成私有的方法,防止外部通过构造器来直接生成实例。同样在代码下方紧跟着的是我们的测试用例,从测试用例中可以看出两个常量的内存地址是一致的。
代码和测试用例如下所示:

因为单例模式较为简单,所以今天的博客就写到这儿吧,还是那句话简单并不代表不重要呢,以后的博客我们将会介绍设计模式中的命令模式、适配器模式、外观模式等等。
上述代码段github分享地址: https://github.com/lizelu/DesignPatterns-Swift
总浏览量
2,111次
博客园历史 1,256 腾讯云 854 本站新增 1
本站阅读按浏览器在 15 分钟内去重;禁用浏览器存储时按网络地址去重。推荐按浏览器一年内去重。仅使用站内随机标识,不采集浏览器指纹。
分享这篇文章
原创内容,未经授权禁止转载。
欢迎分享原文链接。除另有署名或许可说明外,本站原创文章的著作权由青玉伏案享有;未经书面授权,禁止整篇转载、复制发布、改编传播或建立内容镜像。
版权与使用条款
- 依法属于合理使用、法定许可等情形的,按法律规定执行;引用时应注明作者、作品名称和原文链接,不得歪曲、篡改或隐去署名。
- 经书面授权使用的,请遵守约定的用途、范围与署名要求。注明出处不等同于已经取得整篇转载或其他使用授权。
- 第三方图片、引用内容和书籍封面等权利归相应权利人所有;开源代码与 Demo 按其各自许可证使用,本声明不改变已有许可。
- 本声明参考《中华人民共和国著作权法》第十条、第二十四条、第五十二条等。对侵权使用,权利人保留依法要求停止侵害并追究相应责任的权利。

讨论