专题:Swift版:设计模式----单利模式Singleton(奥利给)

1,028 阅读2分钟

这一篇给大家带来的是我们开发中最常用也最简单的单利模式

定义

单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。

适用性

如果程序中的某个类对于所有客户端只有一个可用的实例,即可以使用单例模式。

如果你需要更加严格地控制全局变量,可以使用单例模式。

问题

单例模式同时解决了两个问题, 所以违反了单一职责原则

保证一个类只有一个实例。 那么为什么人们会有这样的想法? 原因很简单,就是控制某些共享资源 (音乐播放器) 的访问权限。

优点

  • 你可以保证一个类只有一个实例。

  • 你获得了一个指向该实例的全局访问节点。

  • 仅在首次请求单例对象时对其进行初始化。

缺点

  • 违反了单一职责原则。该模式同时解决了两个问题。

  • 单例模式可能掩盖不良设计,比如程序各组件之间相互了解过多等。

  • 该模式在多线程环境下需要进行特殊处理,避免多个线程多次创建单例对象。

伪代码(Swift版)

class Singleton {

    /// 创建单利实例,每个子类只有一个实例
    static var shared: Singleton = {
        let instance = Singleton()
        // ... 配置一些参数...
        return instance
    }()

    private init() {}

    ///做你的操作即可
    func aStringMethod() -> String {
        return "字符串"
    }
    func bIntMethod() -> Int{
        return 0
    }
    // ...
}

extension Singleton: NSCopying {

    func copy(with zone: NSZone? = nil) -> Any {
        return self
    }
}

///测试用例
class Client {
    static func testClientCode(){
        let instance1 = Singleton.shared
        let instance2 = Singleton.shared

        print(Unmanaged.passUnretained(instance1).toOpaque())
        ///打印对象内存地址结果: 0x0000000280424100
        
        
        print(Unmanaged.passUnretained(instance2).toOpaque())
        ///打印对象内存地址结果: 0x0000000280424100
        
        
        
    }
    
}


Demo工程传送门

不管我们遇到什么困难,也不要怕,微笑着面对它,消除恐惧的最好办法就是面对恐惧,坚持,才是胜利,加油,奥利给!!