设计模式--swift单例模式

单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并且提供一个全局访问点。

可以想象成有很多个相同的门,打开后都通往一个房间。

iOS中的单例模式:

  • UIApplication.shard:每个应用程序都有且只有一个UI应用程序实例,由UIApplicationMain函数在应用程序启动时创建为单例对象。
  • URLSession.shared:管理网络连接。
  • NotificationCenter.defualt:管理iOS中的通知。
  • UserDefaults.standard:存储轻量级的本地。

优点:

  • 提供对唯一实例的受控访问:防止其他对象对自己实例化,确保所有对象都访问同一个实例
  • 节省系统资源:由于只存在一个对象,因此可以节省系统资源
  • 伸缩性:自己控制实例化的进程,因此易于修改

缺点:

  • 由于单例是全局共享的,很难保证其数据的安全性以及无法确定单例的当前状态
  • 主要是由于单例状态的混乱所造成的。因为单例状态可以被其他人所修改,所以进行测试时,很难从一个干净的状态开始。

code:

Swift 复制代码
import XCTest

/// 通过静态字段 shared 存储该唯一实例。静态字段属于类本身而非某个对象,这意味着在整个应用程序的生命周期内,shared 都指向同一个实例。
class Singleton {

    ///单例的核心。这个 shared 字段存储了 Singleton 的唯一实例,且只会被创建一次。当调用 Singleton.shared 时,程序会执行闭包创建 Singleton 实例,并将其存储到 shared。闭包中的 let instance = Singleton() 负责实例化对象。之后,任何访问 Singleton.shared 的调用都会获得相同的实例。
    ///其中用static修饰的变量或方法是共享的,属于类本身而不是某个实例。无论创建了多少个实例,这个静态成员在内存中只存在一份,且所有实例共享同一个静态成员。
    static var shared: Singleton = {
        let instance = Singleton()
        // ...配置实例
        //...
        return instance
    }()

    /// 确保其他代码无法使用 new 或 init 来创建新的 Singleton 实例,只能通过 shared 来获取实例
    private init() {}

    ///一个示例方法,表示单例对象可能拥有一些业务逻辑。这里简单地返回一个字符串
    func someBusinessLogic() -> String {
        // ...
        return "Result of the 'someBusinessLogic' call"
    }
}

///单例模式要求只有一个实例,因此实现了 NSCopying 协议,通过 copy(with:) 方法返回自身实例,防止复制。
extension Singleton: NSCopying {

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

/// 客服端代码.
class Client {
    // ...
    static func someClientCode() {
        let instance1 = Singleton.shared
        let instance2 = Singleton.shared

        if (instance1 === instance2) {
            print("Singleton works, both variables contain the same instance.")
        } else {
            print("Singleton failed, variables contain different instances.")
        }
    }
    // ...
}


class SingletonConceptual: XCTestCase {

    func testSingletonConceptual() {
        Client.someClientCode()
    }
}
相关推荐
吃汉堡吃到饱10 小时前
【创建型设计模式】单例模式
单例模式·设计模式
程序员与背包客_CoderZ11 小时前
C++设计模式——Singleton单例模式
c语言·开发语言·c++·单例模式·设计模式
白茶等风121381 天前
Unity 设计模式-单例模式(Singleton)详解
单例模式·设计模式
请叫我啸鹏1 天前
C++学习 - 03(单例模式)
c++·学习·单例模式
yyycqupt1 天前
数据库连接池(二)
linux·数据库·c++·后端·单例模式
laimaxgg2 天前
C++特殊类设计(不能被拷贝的类、只能在堆上创建对象的类、不能被继承的类、单例模式)
c++·单例模式
闲人一枚(学习中)2 天前
设计模式-创建型-单例模式
java·单例模式·设计模式
水宝的滚动歌词2 天前
设计模式之单例模式
单例模式·设计模式
小林熬夜学编程2 天前
【Linux系统编程】第五十弹---构建高效单例模式线程池、详解线程安全与可重入性、解析死锁与避免策略,以及STL与智能指针的线程安全性探究
linux·运维·服务器·c语言·c++·安全·单例模式
孟秋与你4 天前
【spring】spring单例模式与锁对象作用域的分析
java·spring·单例模式