本文已更新为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. MPC8313ERDB不新鲜pkg包裹,把文件放进Ramdisk

    MPC8313ERDB不新鲜pkg包裹,把文件放进Ramdisk 经ltib编译器生成rootfs.ext2.gz.uboot它可以直接uboot采用.假设我们编写了相应的外部文件把Ramdisk往里 ...

  2. 【J2SE】java实现简单照片查看器

    程序执行结果: project结构图: 程序代码: import java.awt.BorderLayout; import java.awt.FileDialog; import java.awt. ...

  3. 理解Android虚拟机体系结构(转)

    1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...

  4. [SignalR]Self-Host

    原文:[SignalR]Self-Host SignalR 的Self-Host,可以将客户端脚本需要调用的服务端后台代码寄宿在诸如控制台应用程序中,作为寄宿端需要.NET 4.5以及jquery.s ...

  5. SGU 548 Dragons and Princesses

    意甲冠军: n个月格儿  所有的格龙或公主的儿子  从勇士1走n  不杀  杀死有钱拿  路过公主  假设之前杀龙的数量满足公主要求就会停止行走  问  勇士想多拿钱  可是必需要满足n格子的公主  ...

  6. 7-days-asp-dotnet-mvc-day1

    目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 今天是开心的一天.因为我们终于来到了系列学习的最后一节.我相信你喜欢之前的课程,并从中学到了许多. ...

  7. JavaEE(11) - 消息驱动EJB

    1. MDB作为异步消费者的本质 2. MDB的运行机制 3. 使用@MessageDriven修饰MDB(需要messageListenerInterface) 4. 实现MessageListen ...

  8. POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)

    职务地址:id=2762">POJ 2762 先缩小点.进而推断网络拓扑结构是否每个号码1(排序我是想不出来这点的. .. ).由于假如有一层为2的话,那么从此之后这两个岔路的点就不可 ...

  9. zoj 3537 Cake (凸包确定+间隔dp)

    Cake Time Limit: 1 Second      Memory Limit: 32768 KB You want to hold a party. Here's a polygon-sha ...

  10. UVA 10870 - Recurrences(矩阵高速功率)

    UVA 10870 - Recurrences 题目链接 题意:f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d), ...