本文已更新为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. 【剑指offer】最小的k的数量

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26966159 题目描写叙述: 输入n个整数,找出当中最小的K个数.比如输入4,5,1,6, ...

  2. 分布式中使用Redis实现Session共享(转)

    上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇 ...

  3. window.open的小技巧分享(转)

    今天再次谈起window.open是因为发现了一个比较好玩的小技巧,详细内容我们稍后详细说明.       聊到window.open,不得不说明一下他的使用方法,主要有两种形式:   window. ...

  4. Java Date API demo

    package date; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; /*2015- ...

  5. Cocos2d-x3.3它DrawPrimitivesTest分析

    1.代码列表 2.VisibleRect类 该类是test-cpp自带工具类 3.HelloWorldScene类 同前面代码 4.DrawPrimitivesDemo类 1).h文件 #includ ...

  6. asp.net学习之扩展GridView

    原文:asp.net学习之扩展GridView 本节讨论如何从现有的控件,进而扩展成强大的,更定制的GridView控件 1.扩展BoundField 默认的BoundField不能显示多文本,文字一 ...

  7. UIBarButtonItem 小记边

     watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3poZW4xOTkwMDcwMQ==/font/5a6L5L2T/fontsize/400/ ...

  8. TFS 2010 使安装更容易,让VSS历史

    一转眼VS 2010 RC(Release Candidate)版本号已经公布一月多了,RTM(Release To Manufacturer)版本号也快妥了,已经进入了最后的倒计时,仅仅等4月12号 ...

  9. CSS浏览器兼容性问题集()两

    11.非常适合    高度适合于被改变时所述内目标高度的外层的高度不能自己主动调节,尤其是排队对象时margin 要么paddign 时. 例:   #box {background-color:#e ...

  10. AspNetPager使用指南

    一.AspNetPager支持两种方式分页: 一种是PostBack方式分页, 一种是通过Url来实现分页以及Url重写功能 二.AspNetPager支持各种数据绑定控件GridView.DataG ...