"我知道单例是不好的,但是......",这是开发人员在讨论代码时经常说的话。社区里似乎有一个共识,那就是单例是 "不好的",但同时苹果和第三方的Swift开发者都在应用内部和共享框架中不断使用它们。
本周,让我们来看看使用单例的问题到底是什么,并探讨一些可以用来避免这些问题的技巧。让我们直接开始吧!
为什么单例如此受欢迎?
首先,让我们先问一下,为什么单例一开始就这么受欢迎。如果大多数开发者都同意应该避免使用单例,为什么它们会不断出现?
我认为答案有两个部分:
首先,我认为在为苹果公司的平台编写应用程序时,单例模式被大量使用的一个主要原因是苹果公司自己经常使用它。作为第三方开发者,我们经常期望苹果为他们的平台定义 "最佳实践",通常他们使用的任何模式也会在社区中广泛传播。
我认为,难题的第二部分是方便。单例通常可以作为访问某些核心值或对象的捷径,因为它们基本上可以从任何地方访问。看看这个例子,我们想在ProfileViewController
中显示当前登录用户的名字,并在点击按钮时将用户退出登录:
class ProfileViewController: UIViewController {
private lazy var nameLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
nameLabel.text = UserManager.shared.currentUser?.name
}
private func handleLogOutButtonTap() {
UserManager.shared.logOut()
}
}
像上面那样做——将用户和账户处理功能封装在UserManager
单例中——确实非常方便(而且非常普遍!)。那么,使用这种模式到底有什么不好呢?