首页 > 解决方案 > 从任何地方访问 Singleton

问题描述

在我的游戏中,我创建了一个列表gameObjects(其他类的实例,例如 Player)Main,我可以循环并在一个函数中渲染,而不是单独渲染它们。这是我的渲染功能;

this.gameObjects = [];

addObj(obj){
  this.gameObjects.push(obj);
}

render(){
  this.gameObjects.forEach(obj => obj.render());
}

如果我想像这样gameObject使用我的主类添加另一个,这没问题;

let main = new Main();
let player = new Player(10, 30, 10, 10, 'red');

main.addObject(player);
main.start();

但是,我想添加另一个,在我的班级gameObject中调用。问题是我的班级无法访问'函数。ProjectilePlayerPlayerMainaddObj

我的想法是创建一个单例,它包含一个游戏对象列表,如下所示;

class Repository{
  constructor(){
    if(this.instance){
      return this.instance;
    }
    
    this.list = [];
    this.instance = this;
  }
  
  get obj(){...}
  addObj(obj){...}
}

问题的 tl:dr 是;

标签: javascriptclasssingletones6-class

解决方案


使用单例可能会使单元测试复杂化,并为应用程序的信息流添加隐藏状态。并不是说该模式天生就有缺陷,而是使用该模式有对错之分,如果您不打算花时间了解该模式,最好不要使用它。您的 Singleton 计划会奏效,但它不是最强大的解决方案。

请注意,JS 是一种函数式语言。您不需要将 main 传递给每个类,只需传递 addObject 函数即可。这样,当您更改上下文时(例如在单元测试中或如果您将回收其他项目的代码),您将能够切换传递的函数,并保留所有代码。


推荐阅读