什么时候单例实际上会比静态类更容易或更好?在我看来,创建一个单例只是额外的努力,实际上并不需要,但我确信有一个很好的理由。否则,显然它们不会被使用。
最佳答案
选择单例而不是静态类的一个很好的理由(假设你没有更好的模式可供使用;)),就是用另一个单例实例替换一个单例实例。
例如,如果我有一个像这样的日志类:
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/