今天我读了很多关于Singleton Pattern如何不好的文章,比如
违反单一责任原则
无法继承
无法使用抽象或接口类
整个应用程序的高耦合
使单元测试变得困难
然后我记得我有一个程序,其中包含一个名为User
的类,其中包含字段userName
和password
以及与User
相关的其他内容。在我的构想中,程序应该只有一个用户实例,这是在人类登录程序时创建的。基于此,我应该坚持设计User
类作为Singleton Pattern,还是有任何好的设计构想我应该使用?
Additionl:
另一个疑问。使用Singleton Pattern,我可以在任何地方获得唯一的实例myUser
。如果我不应该使用Singletion Pattern,我应该如何获得唯一的实例myUser
?
答案 0 :(得分:3)
您可能需要查看dependency injection。目前,存在许多框架来帮助您连接依赖注入,以便您可以在框架中指定您希望某个对象的行为类似于单例。换句话说,如果另一个对象也需要相同的"单身"对象,框架不应该创建一个新的实例,但是"注入"已存在的实例。
如果你使用Java开发,你可以看看Guice的做法:https://github.com/google/guice/wiki/Scopes它们允许你指定是否要创建一个"渴望的单身" (即使不需要也会创建)或者#34;懒惰的单身人士" (仅在需要时即时创建)。即使您没有使用Java,其他编程语言也会得到您可以注意的类似概念。
我建议您制作"用户"对象不是单身和"注入"你的用户"对象进入需要"用户"宾语。如果可能的话,让你选择的依赖注入框架处理连线,这样你就不会意外地创建多个实例。
通过这种方式,您仍然可以实现您在问题中发布的大部分上述优势,并且仍然可以享受单身"
的好处。答案 1 :(得分:0)
这取决于您的背景。如果您的应用程序必须只有一个用户,则使用Singleton模式。你提到的5分将完全适得其反。
在您的示例中,情况并非如此。但是只有一个且只有一个实例是执行一个进程所必需的。你应该考虑@Koning的回应。
例如,Spring安全性实现了一些使用静态方法记录的用户的常见模式:
SecurityContextHolder.getContext(). getAuthentication()
答案 2 :(得分:-1)
如果您查看Microsoft成员,您将看到他们将所有数据存储在会话级别。我看到实现这种逻辑的最佳方式是存储在所有会话级别上的是Singleton模式,因为你不需要两个使用用户数据的类。作为替代方案,您可以使用静态类,但在这种情况下您无法序列化您的用户数据