Typescript中一个另类简单的单例模式
本来想使用ts的装饰器
来制作类似c#中Attribute
扫描自动注册Module的方式,但是发现似乎无法做到,于是就转其他方案了,然后脑子突然冒出一个服务定位
于是开始实现它,它实际和单例
相差不是很大.区别就是单例
是类型且只有1个,服务定位
是通过一个ServiceLocation<T>
中间者来管理实例
,实例
就根据ServiceLocation<T>
的实现可以有多个或1个.
不过在我项目中Module
是不允许多个,所以我叫它为ModuleManager
来感觉还比较亲和
下面是测试代码, 在线测试
class ModuleManager
{
private static readonly _moduleMap:{[key:string]:IcModule} = {};
public static GetModule<T extends typeof IcModule>(type: T) : InstanceType<T>
{
if (!this._moduleMap[type.name])
this._moduleMap[type.name] = new type();
return this._moduleMap[type.name] as any;
}
}
class IcModule
{
public static Ins<T extends typeof IcModule>(this: T) : InstanceType<T>
{
return ModuleManager.GetModule(this);
}
}
class TestCC extends IcModule
{
Name:string;
constructor()
{
super();
this.Name = Date.now().toString();
}
}
class TestCC2 extends IcModule
{
get Age():number
{
return Math.random() * 100;
}
constructor()
{
super();
}
}
var test = ModuleManager.GetModule(TestCC);
console.clear();
console.log(test.Name);
console.log(TestCC2.Ins().Age);