从任何地方访问单例
Access Singleton from anywhere
在我的游戏中,我在我的 Main
中创建了一个 gameObjects
列表(其他 classes 的实例,例如 Player),我可以在其中循环并渲染一个功能,而不是单独渲染它们。这是我的渲染函数;
this.gameObjects = [];
addObj(obj){
this.gameObjects.push(obj);
}
render(){
this.gameObjects.forEach(obj => obj.render());
}
如果我想像这样使用我的主 class 添加另一个 gameObject
,这没问题;
let main = new Main();
let player = new Player(10, 30, 10, 10, 'red');
main.addObject(player);
main.start();
但是,我想在我的 Player
class 中添加另一个 gameObject
,称为 Projectile
。问题是我的 Player
class 无法访问 Main
的 addObj
函数。
我的想法是创建一个单例,其中包含一个游戏对象列表,如下所示;
class Repository{
constructor(){
if(this.instance){
return this.instance;
}
this.list = [];
this.instance = this;
}
get obj(){...}
addObj(obj){...}
}
问题的tl:dr是;
- 这是前进的最佳方式吗?
- 我将如何访问这个单例?通过在我需要的任何地方导入它?
- 用实例创建一个全局变量?我该怎么做?
- 我是不是想多了?我是否应该将 main 传递给每个 class 并以这种方式访问它的方法?
使用单例可能会使单元测试复杂化,并向应用程序的信息流添加隐藏状态。并不是该模式天生就有缺陷,而是使用该模式有正确和错误的方法,如果您不打算花时间理解该模式,那么最好不要使用它。您的 Singleton 计划会奏效,只是它不是最可靠的解决方案。
注意JS是一种函数式语言。不用给每个class传递main,直接传递addObject函数即可。这样,当您更改上下文时(例如在单元测试中,或者如果您将回收其他项目的代码),您将能够只切换传递的函数,并保留所有代码。
在我的游戏中,我在我的 Main
中创建了一个 gameObjects
列表(其他 classes 的实例,例如 Player),我可以在其中循环并渲染一个功能,而不是单独渲染它们。这是我的渲染函数;
this.gameObjects = [];
addObj(obj){
this.gameObjects.push(obj);
}
render(){
this.gameObjects.forEach(obj => obj.render());
}
如果我想像这样使用我的主 class 添加另一个 gameObject
,这没问题;
let main = new Main();
let player = new Player(10, 30, 10, 10, 'red');
main.addObject(player);
main.start();
但是,我想在我的 Player
class 中添加另一个 gameObject
,称为 Projectile
。问题是我的 Player
class 无法访问 Main
的 addObj
函数。
我的想法是创建一个单例,其中包含一个游戏对象列表,如下所示;
class Repository{
constructor(){
if(this.instance){
return this.instance;
}
this.list = [];
this.instance = this;
}
get obj(){...}
addObj(obj){...}
}
问题的tl:dr是;
- 这是前进的最佳方式吗?
- 我将如何访问这个单例?通过在我需要的任何地方导入它?
- 用实例创建一个全局变量?我该怎么做?
- 我是不是想多了?我是否应该将 main 传递给每个 class 并以这种方式访问它的方法?
使用单例可能会使单元测试复杂化,并向应用程序的信息流添加隐藏状态。并不是该模式天生就有缺陷,而是使用该模式有正确和错误的方法,如果您不打算花时间理解该模式,那么最好不要使用它。您的 Singleton 计划会奏效,只是它不是最可靠的解决方案。
注意JS是一种函数式语言。不用给每个class传递main,直接传递addObject函数即可。这样,当您更改上下文时(例如在单元测试中,或者如果您将回收其他项目的代码),您将能够只切换传递的函数,并保留所有代码。