美文网首页
【设计模式】05 - 单例模式 (Singleton Patte

【设计模式】05 - 单例模式 (Singleton Patte

作者: Lebron_James | 来源:发表于2019-05-06 19:17 被阅读0次

    这篇文章是我阅读raywenderlich.comDesign Patterns by Tutorials的总结,文中的代码是我阅读书本之后根据自己的想法修改的。如果想看原版书籍,请点击链接购买。


    单例模式限制一个类只能有一个实例,每一个对这个类的引用,都指向同一个实例。

    什么时候使用

    当一个类有多个实例会出现问题的时候,我们使用单例模式。

    简单Demo

    iOS中我们经常会用到一些单例模式,例如:

    UIApplication.shared
    
    NotificationCenter.default
    
    UserDefaults.standard
    
    URLSession.shared
    
    FileManager.default
    

    通常以shareddefaultstandard命名的,都是用单例。

    我们可以创建自己的单例:

    class MySingleton {
        static let shared = MySingleton()
        private init() { }
    }
    
    let singleton = MySingleton.shared
    //let singleton2 = MySingleton() // 报错
    

    在上面这个例子中,我们把MySingleton的初始化函数定义成了private,保证外部不能再自己创建另外一个MySingleton实例。

    另外一种“单例模式”

    我们上面讲到的单例,是一种严格的单例模式,保证一个类只能有一个实例,外部不能再创建第二个实例。

    实际上我们还可以有另外一种类似的单例模式,同样有一个shared实例,但是它允许再创建另外一个实例。例如iOS中的FileManager

    let defaultFileManager = FileManager.default
    let customFileManager = FileManager()
    

    在上面的那个MySingleton例子中,我们把初始化函数的private关键字去掉,就是我们的这部分讲到的单例模式:

    class MySingleton {
        static let shared = MySingleton()
        init() { }
    }
    
    let singleton = MySingleton.shared
    let singleton2 = MySingleton()
    

    总结

    单例模式非常容易滥用。

    当遇到某些需求想要使用单例模式来实现的时候,要优先考虑是否有其他方式可以实现?

    当确定要使用单例模式时,考虑下是否可以让外部自己创建另外一个实例?

    单例模式最大的问题是测试。如果有多个状态存储在一个单例中,测试案例的顺序跟单例的状态有密切的联系,那么在测试的时候就会比较麻烦。

    欢迎加入我管理的Swift开发群:536353151

    下一篇文章:【设计模式】06 - 备忘录模式

    相关文章

      网友评论

          本文标题:【设计模式】05 - 单例模式 (Singleton Patte

          本文链接:https://www.haomeiwen.com/subject/cvodoqtx.html