哪一个是更好的Singleton类或Shared(静态)成员函数

时间:2011-08-09 16:47:07

标签: .net vb.net singleton shared

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

我有一个BankAccount类,其方法可以执行一些业务逻辑。

GetBalance()
GetLast5Credits()
GetMiniStatement()

以及一些写操作。

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

4 个答案:

答案 0 :(得分:4)

都不是。您应该使用依赖注入实例。即你没有建立代码中只有一个实例的假设。您恰好创建了一个实例。这样您就可以轻松地将软件更改为使用多个实例。

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

class MyClass
{
  private readonly IBankAccount bankAccount;

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

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


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

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

答案 1 :(得分:1)

取决于您的应用程序中是否有多个BankAccount。 基本上,Static或Singleton意味着你只能有一个对象的实例 - 在这种情况下是BankAccount。如果你问我,只有一个BankAccount的银行是一个非常差的银行。 :) Here是一个相当不错的解释,但示例代码在C#

答案 2 :(得分:1)

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

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

如果您在内存中持久保存与帐户相关的数据,则单例只在此处有用。然后你可以实现单身作为索引器,包含一系列银行账户记录,但你必须注意竞争条件。

答案 3 :(得分:0)

就个人而言,我更喜欢单一类,以便进行单元测试。您可以模拟实例类,但不能模拟静态类。