博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(五): 简单而又不失其重要性的单例模式(Singleton Pattern)
阅读量:5992 次
发布时间:2019-06-20

本文共 1178 字,大约阅读时间需要 3 分钟。

上篇博客我们系统的介绍了三种,今天我们就来介绍一下单例模式。单例模式虽然简单,但是还是比较重要的,是常用设计模式之一。在之前的博客《》中介绍了Objective-C中MRC和ARC下的单例模式。单例模式应该说是设计模式中最为简单的了,但是简单并不代表其不重要,在程序开发中单例模式的出镜率还是比较高的。举个栗子?,在用户登录你的应用后,你要存储一下用户的基本信息对吧,此时将用户的基本信息放在单例中是比较合适的。因为在这种场景下,当前登录的用户只有一个,而且需要信息统一,所以我们需要使用单例来实现。

“单例”顾明思议,就是单个实例。也就是说一个类在程序运行期间只能生成一个实例。进一步说,如果一个类未被实例过,那么在对类进行实例化的时候就创建一个实例。如果该类已经被实例化了,那么就不需要对该类进行实例化,直接拿过来之前实例化的对象使用即可。下方是单例的定义:

单例模式:确保一个类只有一个实例,并提供一个全局访问点。

在Swift中实现单例也是比较简单的,同样你可以使用GCD进行单例的创建也可以使用静态方法和静态属性来实现。因为今天博客中的代码所涉及的内容只有一个类,在此就不做类图了。

 

一、使用GCD实现单例

GCD在Swift中用着也是非常爽的,下方代码段是使用GCD中的dispatch_once来实现的,使用方法可OC一直。下方代码当然是线程安全的,并且使用了类的静态属性和静态方法。在类下方紧跟着的是测试用例,对创建的两个常量进行地址的打印,我们发现地址是一致的,这就足以说明两个常量指向同一块内存地址。有一点需要注意的是我们需要将生成单例的类的构造函数(Swift中是init()函数)声明成private,这样就避免了外部用户直接使用期构造函数直接生成对象了。在GCD这种实现单例的方式中,如果你不将构造器声明称private类的的,那么是可以生成新的对象实例的。

代码和测试用例如下所示:

    

 

二、使用静态私有常量和静态方法来实现单例

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

代码和测试用例如下所示:

   

 

因为单例模式较为简单,所以今天的博客就写到这儿吧,还是那句话简单并不代表不重要呢,以后的博客我们将会介绍设计模式中的命令模式、适配器模式、外观模式等等。

上述代码段github分享地址:  

转载地址:http://kctlx.baihongyu.com/

你可能感兴趣的文章
人生的长度和宽度
查看>>
python3.4用循环往mysql5.7中写数据并输出
查看>>
python 不得不知的第三方库以及常用安装包
查看>>
图片马的制作以及菜刀的使用
查看>>
Shell命令-文件及目录操作之mkdir、mv
查看>>
Ubuntu vim+ ctags(包含系统函数) + taglist 配置 分类: ...
查看>>
Assert(断言) 的用法
查看>>
并发编程(四)__ConcurrentHashMap
查看>>
Navicat工具、pymysql模块
查看>>
Python--day43--增删改查补充和limit以及order by
查看>>
[转] Java多线程发展简史
查看>>
UILabel自适应内容
查看>>
转载:2016前端开发技术巡礼
查看>>
Web项目开发性能优化解决方案
查看>>
Eclipse工作空间还原到最初状态
查看>>
HTML5页面如何在手机端浏览器调用相机、相册功能
查看>>
zuul的本地跳转
查看>>
升级openssh带来的问题
查看>>
数组遍历 map()、forEach() 及 字符串切割 split() / 字符串截取 slice()、substring()、substr()...
查看>>
判断js对象是否拥有某属性
查看>>