【Egret】TypeScript单例(Singleton)模板的使用

方案一

优点:调用无括号,被继承结构简单

缺点:没有语法提示

写法:
namespace Epitome
{
    export class Singleton
    { 
        private static _Instance;

        static get Instance() 
        { 
            if(!this._Instance)
                this._Instance = new this();
             return this._Instance; 
        } 
    }
}

用法:
class example extends Epitome.Singleton
{
    public print() 
    {
        return "Hello world";
    }
}

调用:
example.Instance.print();

方案二

优点:被继承结构简单,有语法提示

缺点:调用有括号

写法:
namespace Epitome
{
    export class Singleton
    {
        static Instance<T extends {}> (this:new()=>T):T
        {
            if(!(<any>this).Instance)
            {
                (<any>this).Instance=new this();
            }
            return (<any>this).Instance;
        }
    } 
}


用法:

class example extends Epitome.Singleton
{
    public print() 
    {
        return "Hello world";
    }
}

调用:

example.Instance().print();

方案三

优点:调用无括号,有语法提示

缺点:被继承结构复杂点

写法:
namespace Epitome
{
    export function Singleton<T>()
     {
        class Singleton 
        {
            protected constructor() {}

            private static _Instance: Singleton = null;
            
            public static get Instance(): T 
            {
                if(Singleton._Instance == null)
                {
                    Singleton._Instance = new this();
                }
                return Singleton._Instance as T;
            }
        }
        return Singleton;
    }
}


用法:

class example extends Epitome.Singleton<example>()
{
    public print() 
    {
        return "Hello world";
    }
}

调用:

example.Instance.print();

方案四

优点:调用无括号,有语法提示

写法:
namespace Epitome
{
    export class Singleton 
    {
        public constructor() {}

        public static Instance(...param: any[]): any
        {
            let Class: any = this;
            if (!Class._Instance) 
            {
                Class._Instance = new Class(...param);
            }
            return Class._Instance;
        }
    }
}


用法:

class example extends Epitome.Singleton
{
    public print() 
    {
        return "Hello world";
    }
}

class SingletonManager
{
    public static get ExampleManager():example
    {
        return example.Instance();
    }
}

调用:

SingletonManager.ExampleManager.print();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JIQIU.YANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值