为什么要使用单例模式而不是静态类?
为什么要使用单例模式而不是静态类?
何时使用单例模式比静态类更加容易或者更好呢?在我看来,创建一个单例模式只是增加了额外的工作,实际上是不必要的,但我相信一定有一个好的原因。否则,它们显然不会被使用。
admin 更改状态以发布 2023年5月24日
一个选择单例模式而不是静态类的好理由(假设没有更好的设计模式可供选择),就是可以将一个单例实例替换为另一个实例。\n\n比如,如果我有一个像这样的日志类:\n\n
public static class Logger { public static void Log(string s) { ... } } public class Client { public void DoSomething() { Logger.Log("DoSomething called"); } }
\n\n它工作得很好,但是如果Logger将东西写入数据库或将输出写入控制台,如果你正在编写测试,则可能不希望出现所有这些副作用。但是由于log方法是静态的,你除了……没法做别的。\n\n好的,那么我想要为测试热交换我的日志记录方法。上班!单例模式开始动手!\n\n
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"); } }
\n\n因此,您可以定义一个`TestLogger: Logger`,其中包含一个空的`Log`方法,然后将测试记录器的实例设置为用于测试的单例实例。 Presto!您可以在测试或生产中热交换记录器实现,而不影响客户端代码。