设计模式(五): 简单而又不失其重要性的单例模式(Singleton Pattern)

上篇博客我们系统的介绍了三种工厂模式,今天我们就来介绍一下单例模式。单例模式虽然简单,但是还是比较重要的,是常用设计模式之一。在之前的博客《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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT可乐

Redis详解(三)------ redis的五大数据类型详细用法

  我们说 Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提...

1230
来自专栏Jerry的SAP技术分享

一个具体的例子学习Java volatile关键字

相信大多数Java程序员都学习过volatile这个关键字的用法。百度百科上对volatile的定义:

1263
来自专栏运维小白

linux基础(day26)

9.1正则介绍_grep(上) 正则介绍 正则就是一串有规律的字符串 掌握好正则对编写shell脚本帮助交大 各种编程语言中都有正则,原理是一样的 grep/e...

25210
来自专栏从零开始学自动化测试

python笔记20-获取当前运行函数名

写完代码之后,一般为了方便查看日志,可以在日志输出中加入当前运行的函数名称或类和方法名称,以便于代码报错的时候能快速找到报错的是哪个函数或方法。 那么如何获取当...

1411
来自专栏程序员互动联盟

【编程基础】你是否真的了解main()函数?

最近看到很多人、甚至市面上的一些书籍,都使用了void main() ,其实这是错误的。C/C++中从来没有定义过void main() 。C++之父 Bjar...

3316
来自专栏PHP在线

8个与安全相关的PHP函数

1. mysql_real_escape_string() 这个函数对于在PHP中防止SQL注入攻击很有帮助,它对特殊的字符,像单引号和双引号,加...

35712
来自专栏黑泽君的专栏

java基础学习_多线程01_多线程_day23总结

752
来自专栏Felix的技术分享

理解对C++裸指针释放后重用的问题

2369
来自专栏马洪彪

Java设计模式(二)抽象工厂模式

一、场景描述 接《Java设计模式(一)工厂模式》 工厂模式有一缺点,就是破坏了类的封闭性原则。例如,如果需要增加Word文件的数据采集,此时按以下步骤操作: ...

40910
来自专栏angularejs学习篇

页面上通过地址栏传值时出现乱码的两种解决方法

2052

扫码关注云+社区

领取腾讯云代金券