2

我正在开发一个 Firefox 扩展,我希望让多个窗口与相同的信息保持同步。工具栏根据窗口打开的时间定期查询远程服务器的信息。因为 Firefox 窗口都是独立的独立环境,每个都有自己的工具栏运行单独的代码,我想我会在这里使用单例。确实不需要多个请求,每个窗口都可以有一个请求,但问题是没有全局主范围在多个窗口上下文中支配它,只有窗口上下文。我想我会创建一个工厂类来检查其中一个窗口是否已经运行了我的通知类的实例,如果是,则使用相同的实例来获取更新。

这似乎是对单身人士的合法使用,但我一直在阅读他们如何成为邪恶的野兽。这可以用吗?

4

3 回答 3

3

单例本身并没有本质上的错误。问题在于如何(ab)使用它:它本质上是一种拥有全局变量的奇特方式。单例只是让您拥有一个自包含大部分数据的间接级别。但有时,这种模式是解决某些问题的唯一方法。在这种情况下,它完全没问题。但是,如果您能想到另一种可能只使用更多代码/内存/性能影响来完成的方法,那么如果可以的话,我会采用这种方法。否则,使用单例真的没有什么问题,只要你知道你正在进入什么。

于 2009-05-01T20:56:33.850 回答
2

单身人士本身并不邪恶。这是他们的滥用......(您通常可以使用 DI 容器来让您的实例“单调”,这使得这种模式不太推荐)。

我在你描述的领域没有任何经验。然而,单身在我看来是合理的选择。

于 2009-05-01T20:57:34.317 回答
2

问题在于,就 JavaScript 而言,每个 Firefox 窗口都是一个完全独立的进程。

所以是的,它会起作用,但前提是你有条件地创建单例。如果它只是在全局范围内无条件地创建(在我的情况下,作为我的顶级扩展对象的成员),它将在所有窗口中。

您将遇到的另一个问题是 windows 需要一段时间来启动和运行 JavaScript,而且您没有任何类似同步的东西。完全有可能窗口 1 检查窗口 2 是否创建了单例,看到它没有,窗口 2 检查窗口 1,看到它没有,然后都创建自己的单例。

我根据经验说话:我编写了一个 Firefox 扩展程序,它的功能非常类似于您想要做的事情:只有一个窗口应该检查远程服务器(当任何窗口关闭时都需要通知所有其他窗口)。

(在我的系统中,启动时的每个窗口都会查询所有其他窗口以找到“主”窗口。)

解决这个问题的更简洁的方法是创建一个服务,就像浏览器向 javascript 公开的服务一样;但这需要用 C 而不是 javascript 编码,并且使得跨平台安装扩展更加痛苦。

于 2009-05-01T21:05:31.803 回答