design-patterns - 为什么使用单例而不是静态类?

标签 design-patterns class static singleton

什么时候单例实际上会比静态类更容易或更好?在我看来,创建一个单例只是额外的努力,实际上并不需要,但我确信有一个很好的理由。否则,显然它们不会被使用。

最佳答案

选择单例而不是静态类的一个很好的理由(假设你没有更好的模式可供使用;)),就是用另一个单例实例替换一个单例实例。

例如,如果我有一个像这样的日志类:

public static class Logger {
    public static void Log(string s) { ... }
}

public class Client {
    public void DoSomething() {
        Logger.Log("DoSomething called");
    }
}

它工作得很好,但是如果 Logger 将内容写入数据库,或者将输出写入控制台会怎样。如果您正在编写测试,您可能不希望所有这些副作用 - 但由于 log 方法是静态的,因此您不能做任何事情,除了。

好的,所以我想热交换我的 Log 方法以进行测试。去小工具单例吧!

public class Logger {
    private static Logger _instance;
    public static Logger Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Logger();
            return _instance;
        }
        set { _instance = value; }
    }
    protected Logger() { }
    public virtual void Log(string s) { ... }
}

public class Client {
    public void DoSomething() {
        Logger.Instance.Log("DoSomething called");
    }
}

因此,您可以使用空的 Log 方法定义一个 TestLogger : Logger ,然后将测试记录器的实例设置为单例实例以进行测试。急!您可以热交换记录器实现以进行测试或生产,而不会影响客户端代码。

关于design-patterns - 为什么使用单例而不是静态类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2969599/

相关文章:

java - 使用模式和匹配器检索一些文本

c# - 使用 MVVM 管理可取消的部分更新

python - 一种覆盖 'type()' 报告内容的方法

delphi - Delphi中的静态属性

java - 使用注释来记录参数传递策略?

model-view-controller - Zend 框架技术

c++ - 需要类中二维数组的帮助(C++)

Python 类 __init__ 不工作

javascript - 如何在 ES6 中导出静态函数?

PHP 静态变量