本文已更新为2.0语法,具体查看:一叶单例模式

一、意图

保证一个类公有一个实例。并提供一个訪问它的全局訪问点。

二、使用场景

1、使用场景

  • 当类仅仅能有一个实例并且客户能够从一个众所周知的訪问点訪问它时
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。


2、实现的重要三个步骤
  • 私有化构造方法(Swift不支持)
  • 使用一个静态变量保存实例的引用
  • 提供一个全局的訪问方法

三、 Swift语言下的实现

Swift语言不支持变量及方法的权限,没有办法隐藏变量及方法,能够任意直接创建一个实例。

单例的创建有非常多写法,Swift支持仅仅有struct支持静态变量。class不支持静态变量。所以非常easy想到,在类的内部使用struct就能解决引用的保存问题,代码例如以下:

class SwiftSingleton {
class var shared: SwiftSingleton {
dispatch_once(&Inner.token) {
Inner.instance = SwiftSingleton()
}
return Inner.instance!
}
struct Inner {
static var instance: SwiftSingleton?
static var token: dispatch_once_t = 0
} }

执行例如以下測试代码。进行简单測试:

class SwiftSingletonTest: XCTestCase {

    func testSingleton() {
let singleton1 = SwiftSingleton.shared
let singleton2 = SwiftSingleton.shared
assert(singleton1 === singleton2, "pass")
} }

执行结果,左側绿色对号代表执行通过:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZzFqdW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

当中===在Swift中代表“等价于”,比較的是两个变量或者常量的引用地址,仅仅能用于class的比較

在Swift中static类型变量会自己主动实现成延迟载入模式。也能够更简单的实现成例如以下:
class SwiftSingleton {
class var shared: SwiftSingleton {
return Inner.instance
} struct Inner {
static let instance = SwiftSingleton()
}
}

在全部语言中单例分为懒汉模式(延迟载入),饿汉模式,一般为了避免资源浪费,都喜欢实现成懒汉模式。即使用时在生成实例。在Swift语言中,因为statickeyword做了优化。自己主动实现了 延迟载入模式。所以上面的代码实现的是懒汉模式而并不是饿汉模式



四、可能引起错误的实现

class与struct一个很重要的差别:
class:传引用
struct:传值
有部分人可能想通过struct来直接实现单例模式,因为struct传递时是传的值。会造成内存中有多个拷贝。測试例如以下:
struct SwiftSingleton {
var name: String = "1"
static let shared = SwiftSingleton()
} var single1 = SwiftSingleton.shared
var single2 = SwiftSingleton.shared single2.name = "2" println("------->\(single1.name)")
println("------->\(single2.name)")

打印结果例如以下:

------->1
------->2
Program ended with exit code: 0

从上面能够看到,通过struct下的实现,我们不能保证只有一个实例,这样的实现是一个问题


版权声明:本文博客原创文章。博客,未经同意,不得转载。

Swift辛格尔顿设计模式(SINGLETON)的更多相关文章

  1. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

  2. 设计模式——辛格尔顿(Singleton)

    要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 单例模式属于设计模式 ...

  3. C++设计模式-Singleton

    Singleton单例模式 Singleton 是对全局变量的取代策略作用:保证一个类只能有一个实例,并提供一个全局唯一的访问点. 仅有一个实例:通过类的静态成员变量来体现.提供访问它的全局访问点:访 ...

  4. Java学习笔记——单例设计模式Singleton

    单例设计模式:singleton 解决的问题: 确保程序在运行过程中,某个类的实例instance只有一份. 特点: 1 构造函数私有化 2 自己内部声明自己 3 提供一个public方法,负责实例化 ...

  5. Java学习笔记(二十四):单例设计模式singleton

    为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要ne ...

  6. Swift 实现单例模式Singleton pattern的三种方法

    转自:点击打开链接 From my short experience with Swift there are three approaches to implement the Singleton ...

  7. [C++设计模式] singleton 单例模式

    这个设计模式主要目的是想在整个系统中仅仅能出现一个类的实例.这样做当然是有必定的.比方你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等. 你希望这个类在整个系统中仅仅能出现一个实 ...

  8. 单例设计模式singleton

    简单引入 单例设计模式作为最简单,最常用的设计模式.一般是这两中写法,这两种写法教科书所谓的标准写法,但是实际上存在不少问题.后面介绍标准写法,以规避这些问题. 1.懒汉式: /** * 问题在于,当 ...

  9. Java设计模式—单例设计模式(Singleton Pattern)全然解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

随机推荐

  1. android可扩展自己的定义,运动图像裁剪框

    在实际项目中,常常要制作一个简易的图像裁剪功能,即获取一张图片.并用一个遮罩层选择目标范围并截取保存的功能.例如以下图所看到的: 在此分享下该自己定义视图的制作过程. 需求说明 整一个视图包括一个透明 ...

  2. css3 menu 手机菜单3

    首先看一下效果图; 效果1,主要是 scale(0) -->scale(1px);opacity:0;—>opacity: 1; 然后递归延迟 怕麻烦也可以自己写个for循环 .five ...

  3. linux 字符界面浏览器 w3m(转)

    最近找到了几个linux终端下使用的浏览器,主要用来测试本机web服务器是否搭建成功.因为我们一般是用ssh客户端连接linux的,所以很需要一个字符界面的浏览器.找了几个显示都不理想,只有w3m用起 ...

  4. oracle 11g 基于磁盘的备份rman duplicate

    基于磁盘的备份rman duplicate 命令创建standby database 前提条件: 确保原始库数据库的备份.存档standby 结束是完全可见, 这里,如果原始文库和靶 - 侧数据文件, ...

  5. ScrollView 在嵌套 ViewPager 时出现的问题

    1.在ViewPager 外面嵌套ScrollView 时导致ViewPager 中内容不显示,解决的办法是在ScrollView 标签下增加 android:fillViewport="t ...

  6. SQL Server 服务器磁盘测试之SQLIO篇

    原文:SQL Server 服务器磁盘测试之SQLIO篇 数据库调优工作中,有一部分是需要排查IO问题的,例如IO的速度或者RAID级别无法响应高并发下的快速请求.最常见的就是查看磁盘每次读写的响应速 ...

  7. python派QQ邮件

    #encoding=utf-8 __author__ = 'ds' #文件名冲突 from email.mime.text import MIMEText import smtplib if __na ...

  8. java回调机制及其实现(转)

    1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...

  9. Unity最优化摘要

    我们的游戏已经wp8.ios和android平台上的线. 这是我第一次做Unity工程,过程中遇到很多困难和挫折,但是,我和小伙伴探路,现在.该游戏已经上线一段时间.而且很稳定.为Unity.我一直在 ...

  10. Nyoj 吝啬的国度(图论&&双DFS)

    描述在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你 ...