名为`User`的类应该是Singleton Pattern的实现吗?

时间:2016-10-04 05:42:59

标签: oop design-patterns singleton

今天我读了很多关于Singleton Pattern如何不好的文章,比如

  1. 违反单一责任原则

  2. 无法继承

  3. 无法使用抽象或接口类

  4. 整个应用程序的高耦合

  5. 使单元测试变得困难

  6. 然后我记得我有一个程序,其中包含一个名为User的类,其中包含字段userNamepassword以及与User相关的其他内容。在我的构想中,程序应该只有一个用户实例,这是在人类登录程序时创建的。基于此,我应该坚持设计User类作为Singleton Pattern,还是有任何好的设计构想我应该使用?

    Additionl:

    另一个疑问。使用Singleton Pattern,我可以在任何地方获得唯一的实例myUser。如果我不应该使用Singletion Pattern,我应该如何获得唯一的实例myUser

3 个答案:

答案 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模式,因为你不需要两个使用用户数据的类。作为替代方案,您可以使用静态类,但在这种情况下您无法序列化您的用户数据