Swift辛格尔顿设计模式(SINGLETON)


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



1、意图

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


2、使用场景

一、使用场景java

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


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

 3、 Swift语言下的实现

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

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

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")
    }
    
}

执行结果,左側绿色对号表明执行经过:

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

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

在所有语言中单例分为懒汉模式(延迟载入),饿汉模式,通常为了不资源浪费,都喜欢实现成懒汉模式。即便用时在生成实例。在Swift语言中,由于statickeyword作了优化。本身主动实现了 延迟载入模式。因此上面的代码实现的是懒汉模式而并非饿汉模式


4、可能引发错误的实现

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下的实现,咱们不能保证只有一个实例,这样的实现是一个问题

版权声明:本文博客原创文章。博客,未经赞成,不得转载。优化

相关文章
相关标签/搜索