[TypeScript][CocosCreator]泛型单例

本文介绍了一种改进型的单例模式实现方法,并通过具体示例展示了如何使用该模式来创建不同类型的对象实例,如动物类的实例。尽管这种方法需要将类自身作为参数传入构造函数,但依然为单例模式的应用提供了一种新的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * Ts's singleton is too ugly.so i will not use it.
 */
export class Singleton<T>{
    private static instance: any = null;
    public static Instance<T>(c: { new(): T }): T {
        if (this.instance == null) {
            this.instance = new c();
        }
        return this.instance;
    }

    public Update(dt: number) {

    }
}

还需要把类传入,用于构造函数生成instance,感觉很不友好啊。

使用示例

Animal.ts

import { Singleton } from "./Singleton";

export class Animal<T> extends Singleton<T> {
    public root: string = "animal";
}

Beast.ts

import { Animal } from "./Animar";

export class Beast extends Animal<Beast> {
    public name = "beast 1";
    constructor() {
        super();
        this.root = "i am a beast";
    }
}

Bird.ts

import { Animal } from "./Animar";

export class Bird extends Animal<Bird> {
    public name: string = "bird 1";
    constructor(){
        super();
        this.root="i am a bird";
    }
}

使用

    let bird = Bird.Instance<Bird>(Bird);
    let beast = Beast.Instance(Beast);

    Debug.Log(bird.root);
    Debug.Log(bird.name);
    Debug.Log(beast.root);
    Debug.Log(beast.name);

打印结果:
在这里插入图片描述

<think>好的,我现在需要回答用户关于Cocos Creator组件能否实现的问题。首先,我得理解用户的需求。用户可能是在开发游戏时,希望某个组件只有一个实存在,比如游戏管理器、音效控制器等,这时候模式就很有用。 接下来,我需要回忆Cocos Creator的基本结构。Cocos Creator使用组件系统,每个节点都可以附加多个组件。模式通常指一个类只有一个实,并提供全局访问点。但在Cocos Creator中,组件是附加到节点上的,所以需要找到一种方法确保组件只存在一个实。 然后,我得考虑如何实现。可能的思路是,在组件被加载时检查是否已经有实存在。如果有,就销毁新创建的实;如果没有,就将当前实设为。同时,需要处理节点销毁的情况,避免出现悬空引用。 另外,要考虑编辑器和运行时的情况。在编辑器下,可能不希望逻辑被执行,所以需要判断是否在编辑器环境中。还有,全局访问可以通过静态属性或者挂载到全局对象上来实现。 可能遇到的问题包括:多个场景切换时的处理,节点被销毁后如何重新创建实,以及如何防止重复创建。需要确保代码的健壮性,比如使用getter方法延迟初始化,或者在onLoad生命周期钩子中处理实的创建和销毁。 最后,应该给出一个示代码,展示具体的实现方法,并解释每个步骤的作用。同时提醒用户注意事项,比如避免在编辑器下运行,处理节点销毁的情况,以及如何正确访问。</think>在Cocos Creator中可以通过以下方式实现组件(推荐方案): ```typescript // SingletonComponent.ts const { ccclass, property } = cc._decorator; @ccclass export default class SingletonComponent extends cc.Component { // 静态实引用 private static _instance: SingletonComponent = null; // 生命周期方法 onLoad() { // 编辑器环境下不执行逻辑 if (CC_EDITOR) return; if (SingletonComponent._instance) { // 已存在实时销毁新节点 this.node.destroy(); return; } // 设置当前实 SingletonComponent._instance = this; // 持久化节点(跨场景保留) cc.game.addPersistRootNode(this.node); } // 安全访问方法 public static get instance(): SingletonComponent { if (!this._instance) { // 自动创建实(可选) const node = new cc.Node('SingletonNode'); node.addComponent(SingletonComponent); } return this._instance; } // 销毁处理 onDestroy() { if (SingletonComponent._instance === this) { SingletonComponent._instance = null; } } } ``` **实现原理说明:** 1. **静态实存储**:通过静态属性`_instance`保存唯一实引用 2. **生命周期控制**: - `onLoad()`中处理实创建逻辑 - 检测到已有实时自动销毁新节点 - 使用`cc.game.addPersistRootNode()`实现跨场景持久化 3. **安全访问**: - 提供静态getter方法访问实 - 支持按需自动创建(可选功能) **使用方式:** ```typescript // 其他脚本中访问 const singleton = SingletonComponent.instance; ``` **注意事项:** 1. **编辑器环境**:`CC_EDITOR`判断避免编辑器下执行逻辑 2. **场景切换**:使用`addPersistRootNode()`保持节点不被销毁 3. **销毁处理**:重写`onDestroy()`清除实引用 4. **线程安全**:Cocos Creator线程特性无需考虑多线程问题 **增强方案建议**: - 需要自动创建时建议通过`cc.find()`查找现有实 - 可添加类支持多 - 可结合装饰器实现声明式 这种实现方式符合Cocos Creator的组件系统特性,能够有效管理全局唯一组件实,建议根据具体需求调整持久化和自动创建策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

iningwei

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

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

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

打赏作者

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

抵扣说明:

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

余额充值