为什么要使用单例模式而不是静态类?

12 浏览
0 Comments

为什么要使用单例模式而不是静态类?

何时使用单例模式比静态类更加容易或者更好呢?在我看来,创建一个单例模式只是增加了额外的工作,实际上是不必要的,但我相信一定有一个好的原因。否则,它们显然不会被使用。

admin 更改状态以发布 2023年5月24日
0
0 Comments

单例模式通常比全局变量更受欢迎,因为:

  • 它们不会用不必要的变量污染全局命名空间(或在有命名空间的语言中,则是它们所在的命名空间)。
  • 它们允许延迟分配和初始化,而许多语言中的全局变量将始终消耗资源。

来源

编辑:

单例模式的一个很酷的用途是,当与工厂方法结合使用时,可以用于创建享元模式。 当你创建新对象时,工厂方法(而不是创建新对象)首先检查该对象的单例是否已经存在,如果是,则只返回该对象,如果没有,则创建一个新的单例并返回它,跟踪它创建的单例。 享元由于单例的不可变性而工作。

0
0 Comments

一个选择单例模式而不是静态类的好理由(假设没有更好的设计模式可供选择),就是可以将一个单例实例替换为另一个实例。\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!您可以在测试或生产中热交换记录器实现,而不影响客户端代码。

0