【问题标题】:Which one is better Singleton class or Shared (static) Member functions哪个更好单例类或共享(静态)成员函数
【发布时间】:2011-08-09 16:47:06
【问题描述】:

我想了解通过 Singleton 类对 VB.Net 中类的共享(静态)成员使用常用方法的优点和缺点。它可以是时间、空间复杂性或最佳实践。

我有一个 BankAccount 类,其中包含一些执行一些业务逻辑的方法。

GetBalance()
GetLast5Credits()
GetMiniStatement()

还有一些写操作。

在这种情况下,访问成员函数的哪种方法更好?共享还是单例?

【问题讨论】:

  • 这肯定是重复的,但我懒得搜索了。

标签: .net vb.net singleton shared


【解决方案1】:

两者都没有。您应该使用依赖注入实例。也就是说,您不会假设代码中只有一个实例。您只是碰巧创建了一个实例。这样您就可以轻松更改您的软件以使用多个实例。

这里的基本思想是将银行帐户作为类的构造函数中的参数:

class MyClass
{
  private readonly IBankAccount bankAccount;

  public MyClass(IBankAccount bankAccount)
  {
    this.bankAccount=bankAccount;
  }
}

由于手动创建这样的类可能会很烦人,如果您需要传递很多东西,您通常会使用依赖注入器/IoC 容器来为您完成。


静态方法应该用于无状态的无副作用的辅助函数。 MathEnumerable 有很好的静态方法示例。

一般来说,您应该避免全局可变状态。银行账户显然是可变的。在这里,经典的单例是较小的邪恶(您可以将实现替换为测试目的),但它仍然是一个糟糕的选择。

【讨论】:

  • +1,但是一个例子或至少一个链接可以帮助人们理解你对dependency injected instance的意思。
【解决方案2】:

这取决于您是否要在应用程序中拥有多个 BankAccount。 基本上,Static 或 Singleton 意味着您只能拥有所讨论对象的一个​​实例——在本例中为 BankAccount。如果你问我,只有一个 BankAccount 的银行是一家非常糟糕的银行。 :) Here 是一个相当不错的解释,但示例代码是用 C# 编写的

【讨论】:

    【解决方案3】:

    我相信你也不想在这里......

    但是为了将来参考,您所说的共享类不应该与维护状态有任何关系 - 每个静态方法都应该只使用传入的参数。这使得这种类型的类仅对实用程序函数有用。

    只有在您将与帐户相关的数据保存在内存中时,单例才有用。然后您可以实现一个单例作为索引器,其中包含一组银行帐户记录,但您必须注意竞争条件。

    【讨论】:

      【解决方案4】:

      就个人而言,为了单元测试,我更喜欢单例类。可以模拟实例类,但不能模拟静态类。

      【讨论】:

        猜你喜欢
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-09
        • 2018-10-08
        • 2013-07-27
        相关资源
        最近更新 更多