TS的泛型单例模板(已解决)

嗯,我翻了TS官方文档,但是不好找。刚接触TS没几天,很多懵逼。
你说“切换场景后,你还要确定单例只有一个这个要加一个if判断”,我不太理解。

不错,是的。

算了,等你考虑性能这一方面,你就知道我说什么了~

用单例就是要考虑性能,大佬若方便指点一下,:cry:或者能推荐一下博客之类的。。。

你去查一下C#的高级单例,你就明白!

if(s_instance == null){}这句。。。

其实你这句话,我unity 的时候,null放前面的,ccc 我没有试过,你可以试下~,因为两个位置不同,结果是不一样的。具体你可以去查(ps:我忘了)。我说的问题是单线程和多线程的处理问题。

好像懂了,加个lock就行。

毕竟我是做微信,要优化都极致,哈哈

这个脚本有时无法加载是怎么回事?写的泛型单例模板有时无法调用方法有时可以是怎么回事?


这是我的工程:
HuangLeQiuQiu.zip (2.2 MB)

大佬,我遇到这个泛型单例模板时灵时不灵的情况,严重时还害我整个工程崩掉无法恢复。你知道是哪里冲突了吗?

去百度一下单例是什么~! MVC 估计在我眼里只有V是要挂上组件的

继承SingletonBase就可以了

我要限制T必须是Component类型的,你这样写可以吗?

继承的子类能作为一个组件被挂载吗?

你的单例可以了?为什么我写的不行,就仿照C# 写的,变量、方法都可以调用,单例模式下访问node就报空引用,遇到过没?

TypeScript 的模板并不是真正的模板。所有模板类实际上都是同一个类。

这里给出一种用装饰器实现的方法,很方便。仅供参考。

装饰器实现:

export function singleton<T>(target: new () => T) {
    let instance: object | null = null;
    Object.defineProperty(target, 'getInstance', {
        value: () => {
            // @ts-ignore
            return instance || (instance = new target());
        },
    });
    return target;
};

export namespace singleton {
    export function get<T>(constructor: new (...args: any[]) => T): T {
        // TODO: check here
        return (constructor as any).getInstance();
    }
}

使用:

@singleton
class C {
    public name = 'foo';
}
@singleton
class D extends C {
}

测试:

console.log(singleton.get(C).name); // 应该输出 'foo'
singleton.get(C).name = 'bar';
console.log(singleton.get(C).name); // 应该输出 'bar'
console.log(singleton.get(D).name); // 应该输出 'foo'
7赞

可以参考我的回复。

看了各位给出的单例参考,感觉都忽视了单例的特性之一:构造函数私有化,以防止外部new出实例。