首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在TypeScript中定义单例

如何在TypeScript中定义单例
EN

Stack Overflow用户
提问于 2015-05-12 01:35:09
回答 20查看 132.6K关注 0票数 159

在TypeScript中实现类的单例模式最好、最方便的方法是什么?(无论有无延迟初始化)。

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2015-05-12 01:50:57

TypeScript中的单例类通常是一种反模式。您可以简单地使用namespaces

无用的单例模式

代码语言:javascript
复制
class Singleton {
    /* ... lots of singleton logic ... */
    public someMethod() { ... }
}

// Using
var x = Singleton.getInstance();
x.someMethod();

命名空间等效项

代码语言:javascript
复制
export namespace Singleton {
    export function someMethod() { ... }
}
// Usage
import { SingletonInstance } from "path/to/Singleton";

SingletonInstance.someMethod();
var x = SingletonInstance; // If you need to alias it for some reason
票数 97
EN

Stack Overflow用户

发布于 2015-07-01 14:47:29

我发现的最好的方法是:

代码语言:javascript
复制
class SingletonClass {

    private static _instance:SingletonClass = new SingletonClass();

    private _score:number = 0;

    constructor() {
        if(SingletonClass._instance){
            throw new Error("Error: Instantiation failed: Use SingletonClass.getInstance() instead of new.");
        }
        SingletonClass._instance = this;
    }

    public static getInstance():SingletonClass
    {
        return SingletonClass._instance;
    }

    public setScore(value:number):void
    {
        this._score = value;
    }

    public getScore():number
    {
        return this._score;
    }

    public addPoints(value:number):void
    {
        this._score += value;
    }

    public removePoints(value:number):void
    {
        this._score -= value;
    }

}

下面是你如何使用它:

代码语言:javascript
复制
var scoreManager = SingletonClass.getInstance();
scoreManager.setScore(10);
scoreManager.addPoints(1);
scoreManager.removePoints(2);
console.log( scoreManager.getScore() );

https://codebelt.github.io/blog/typescript/typescript-singleton-pattern/

票数 48
EN

Stack Overflow用户

发布于 2015-05-12 01:35:09

下面的方法创建了一个Singleton类,它可以像传统类一样使用:

代码语言:javascript
复制
class Singleton {
    private static instance: Singleton;
    //Assign "new Singleton()" here to avoid lazy initialisation

    constructor() {
        if (Singleton.instance) {
            return Singleton.instance;
        }

        this. member = 0;
        Singleton.instance = this;
    }

    member: number;
}

每个new Singleton()操作将返回相同的实例。然而,这可能是用户意想不到的。

下面的示例对用户更加透明,但需要不同的用法:

代码语言:javascript
复制
class Singleton {
    private static instance: Singleton;
    //Assign "new Singleton()" here to avoid lazy initialisation

    constructor() {
        if (Singleton.instance) {
            throw new Error("Error - use Singleton.getInstance()");
        }
        this.member = 0;
    }

    static getInstance(): Singleton {
        Singleton.instance = Singleton.instance || new Singleton();
        return Singleton.instance;
    }

    member: number;
}

用法:var obj = Singleton.getInstance();

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30174078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档