TypeScript中,单例模式相比模块化的设计有何优势?

4

我已经使用 Node.js/JavaScript 几年了,现在开始熟悉 TypeScript。我正在尝试理解在 TypeScript 中何时使用类和何时使用模块。

在 JavaScript 中,我经常像这样创建模块:

const name = "batman";

function getName() {
  return name;
}

module.exports = {
  name
};

在 TypeScript 中,同样的代码可以编写为:

const name: string = "batman";

export function getName(): string {
  return name;
}

然而,在网上阅读时,有相当数量的 TypeScript 单例模式示例。我也可以像这样编写单例类的代码:

export default class Singleton {
    private static instance: Singleton;
    private name: string = "batman";

    private constructor() { }

    public static getInstance(): Singleton {
        if (!Singleton.instance) {
            Singleton.instance = new Singleton();
        }

        return Singleton.instance;
    }

    public getName() {
        return this.name;
    }
}

我很难理解为什么要创建一个单例,因为模块更简洁易懂,只存在一个实例。不过,单例有哪些优点呢?


传统类的一个好处是每个实例都可以拥有自己的变量版本。它们可以相互独立。如果您不需要这样做,使用单例可以避免在内存中拥有多个具有相同值的类实例。 - Taplar
2
这很有道理。但是你也可以使用模块来做同样的事情,而且你永远不必调用getInstance()。看起来模块会产生更清晰的代码。 - MonkBen
我不确定我理解了。模块使用并不能保证你拥有一个类的实例。一个模块可以是一个类定义,而你后来必须创建这个类的一个实例。 - Taplar
我的意思是我在示例中定义模块的方式。我不确定有更好的名称。从技术上讲,在TypeScript中,一个模块可以导出多个类。然而,按照我定义模块的方式,只能有一个实例。 - MonkBen
1个回答

3

是的,模块更简单,而且在很多情况下也是更好的选择。然而,单例有两个优点:

  • 它们可以使用延迟初始化,在第一次使用时被实例化
  • 如果需要多个实例,它们可以更容易地转换为普通的class。(实际上,如果您的实例具有状态(与您示例中的代码不同),这种情况相当常见)。

谢谢,这让我很有感觉。 - MonkBen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接