美文网首页
单例中静态属性的额外作用

单例中静态属性的额外作用

作者: 梁杰_numbbbbb | 来源:发表于2017-01-10 21:40 被阅读33次

作者:Erica Sadun,原文链接,原文日期:2017-01-05
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

Laptopmini 给我留言道:「是否可以为单例 (singleton) 的共享实例 (shared instance) 定义一个 get 闭包呢?我现在正在编写一个网络 socket 管理器,我希望在每次调用 connect() 的时候都能够匹配到这个实例」。

一个基本的 Swift 单例如下所示:

public final class Singleton {
    public static let shared = Singleton()
    private init() { }
}

这种设计模式创建了一个类,这个类只有一个可访问的共享实例。此外这个类被标记为 final,其构造器的访问域为 private,以确保这个类型不能被继承,也不能通过 shared 之外的方法被实例化。

为了给大家介绍「静态属性的额外作用 (side effect)」,我们创建一个间接访问此单例的静态属性,然后向 getter 方法中添加自定义的行为:

public final class Singleton {
    private static let _shared = Singleton()
    private init() { }
    
    public static var shared: Singleton {
        get {
            print("side effects here")
            connect() // 举个栗子
            return _shared
        }
    }
}

这样写也行,不过这段代码还可以更为精简。对只读属性而言,完全可以移除 get 语法。直接将自定义行为移到最顶层的 var 闭包单重,如以下修改所示:

public final class Singleton {
    private static let _shared = Singleton()
    private init() { }
    
    public static var shared: Singleton {
        print("side effects here")
        connect() // 举个栗子
        return _shared
    }
}

来快速总结一下:

  • 对于单例而言,请使用引用类型;
  • 将单例类型标记为 final,其实例标记为 public,构造器标记为 private
  • 在命名的时候,尽量使用更符合 Swift 风格的 shared,而不是 Objective-C 风格的 sharedInstance
  • 如果在获取单例的时候还需要引入其他的额外作用,那么可以创建一个静态的只读属性;
  • 对于只读属性而言,get 语法可以移除以达到精简的效果。

如果大家对这段代码有其他的改进或者建议,就和以前一样,在评论中留言评论,或者在 tweet 上私信我。

Rob N 在这里说得非常好:

@ericasadun 这篇文章很好,但是我对其中的用例有些顾虑。也就是说 self.websocketWebsocket.shared 相比,它们的行为可能是大相径庭的,即便它们都是同一个对象。
—— Rob Napier (@cocoaphony) 2017年1月5日
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg

相关文章

  • 单例中静态属性的额外作用

    作者:Erica Sadun,原文链接,原文日期:2017-01-05译者:星夜暮晨;校对:Crystal Sun...

  • 实现单例类

    注意静态方法不能调用对象属性 所以要把单例存在静态变量中 更高效的单例

  • Swift单例

    继承NSObject单例 class CardUtil : NSObject{ /* 静态属性shared...

  • iOS单例模式

    单例模式 解决“应用中只有一个单例”的一类问题。 Objecttive-C实现原理 单例模式一般会封装一个静态属性...

  • JavaScript之Math、Number对象

    一、Math对象 单例模式,只提供静态属性和方法:常用方法静态属性Math.EMath.PI静态方法取绝对值 M...

  • Android - 常见内存泄漏

    单例 单例静态对象持有activity引用,且因静态对象生命周期比activity还长,当act被销毁时,单例中的...

  • iOS 基础02--单例、属性修饰符、深浅拷贝

    iOS 基础02--单例、属性修饰符、深浅拷贝 单例 讲单例就必须得先讲讲单例这种设计模式的作用和最可能出现的应用...

  • 单例模式与反射的博弈

    单例模式与反射的博弈 1. 单例模式介绍 单例模式的核心概念是:私有化构造器,私有化静态对象属性,对外公开获取对象...

  • Java 单例模式

    什么是单例模式? 单例模式即一个类在程序中永远只有一个实例。 单例的写法。 饿汉式(静态常量) 饿汉式(静态代码块...

  • Kotlin object对象

    Kotlin中没有静态属性和方法,但是可以使用关键字object声明一个object单例对象: companion...

网友评论

      本文标题:单例中静态属性的额外作用

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