Singleton还是static-我应该使用什么

本文关键字:什么 我应该 还是 static- Singleton | 更新日期: 2023-09-27 18:04:22

我不知道该用什么。我有三节课。PasswordServiceSettingsServiceFileService。这些类每个包含大约2个方法。这些方法正在更多的程序集中使用。现在我将它作为一个单例使用。但我不确定我是否应该。我认为静态类就足够了。你觉得怎么样?

代码:

public class PasswordService
{
    private PasswordService(){}
    private static PasswordService _instance;
    public static PasswordService Instance
    {
        get { return _instance ?? (_instance = new PasswordService()); }
    }
    public byte[] EncryptPassword(string password)
    {
        var protectedPass = Encoding.UTF8.GetBytes(password);
        return ProtectedData.Protect(protectedPass, null);
    }
    public string DecryptPassword(byte[] encryptedPassword)
    {
        var unprotectedPass = ProtectedData.Unprotect(encryptedPassword, null);
        return Encoding.UTF8.GetString(unprotectedPass, 0, unprotectedPass.Length);
    }
}

Singleton还是static-我应该使用什么

您的类中没有任何状态,所以我看不出有任何理由使用类的实例。我建议您使用静态类。

1-为这些服务创建一个单例是正确的,因为这些服务似乎是处理一个特定的任务。

2-尽可能避免静态,因为如果您使用TDD并使用连续集成服务器进行自动单元测试,您将无法有效地模拟它。

我建议您保留Singleton,除非您使用实例或DI。Singleton可以很容易地重构为实例,而静态类必须重新实现为非静态类。此外,您可以用测试假人替换实例,而替换静态实现几乎是不可能的。

例如,您可能会遇到这样一种情况,即您的程序必须为两个不同的配置文件处理多个FileConfiguration实例。Singleton可以拆分为两个实例池。

我在一个DAO类中遇到了这个问题,该类过去是静态的,能够连接到一个DB。我们不得不重构它,因为一个新的需求包括在一个程序实例中支持n>1个数据库。

正如Mikhail所指出的,只对真正无状态的内容使用static。静态字段中的配置文件或选定的密码哈希算法已经是状态,我上面的例子中的连接字符串也是,即使它们在运行时可能永远不会改变。