SingleFactory-TypeScript中实现单例工厂 | ituuz

专注于游戏开发

SingleFactory-TypeScript中实现单例工厂

SingleFactory

介绍

单例对象在开发中很常用,每个单例对象都单独实现单例逻辑会很繁琐也不方便,不统一,同时单例对象数据也不方便管理。SingleFactory提供了一套快速创建单例对象并且对单例对象进行了管理,可以随时释放掉指定的单例对象,也可以直接释放掉创建过的所有单例对象。

接口介绍

  • getInstance: 获取单例接口,传入继承SingleBase的类,则会返回该类的单例对象

    1
    2
    3
    4
    5
    /**
    * 创建接口
    * @param {new() => T} type T是要求继承自SingleBase的类型
    */
    static getInstance<T extends SingleBase>(type: new() => T): T;
  • clear: 清理指定的单例对象

    1
    2
    3
    4
    5
    /**
    * 释放指定的单例对象
    * @param {new() => T} type T是要求继承自SingleBase的类型
    */
    static clear<T extends SingleBase>(type: new() => T): void
  • clearAll: 清理所有单例对象

    1
    static clearAll: void;
  • 用法实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 目标类要求继承SingleBase
    class Test extends SingleBase {
    public test() {
    it.log("我是单例对象");
    }
    }
    // 获取单例对象
    let t = SingleFactory.getInstance(Test);
    t.test();

    实现细节

  • 主要是通过js可以用字符串调用属性的特性来实现单例对象的创建和赋值。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 传入继承自SingleBase的类型,返回对应的实例对象
    public static getInstance<T extends SingleBase>(type: new() => T): T {
    if (!type["_instance"]) {
    let target = new type();
    type["_instance"] = target;
    // 单例对象可以重写init接口来实现初始化逻辑
    target.init();
    // 缓存单例对象的引用,方便管理,用于后期释放
    SingleFactory._instanceList.set(type, target);
    return target;
    }
    return type["_instance"];
    }
  • 最后

    改SingleFactory工具类整合在我开源的一个cocos creator游戏开发框架中,欢迎关注:https://github.com/yue19870813/ituuz-x

    ituuz wechat
    欢迎您扫一扫上面的微信公众号,订阅我的博客,关注我就是给我最大的支持!
    坚持原创技术分享,您的支持将鼓励我继续创作!