我真的需要一个Singleton吗?

时间:2009-05-01 20:50:53

标签: javascript design-patterns singleton firefox-addon

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

单身者本身并不邪恶。这是他们的滥用......(你通常可以使用DI容器让你的实例“单例”,这使得这种模式更少推荐)。

我对您描述的领域没有任何经验。然而,单身人士在我看来似乎是合理的选择。

答案 2 :(得分:2)

问题是,就Javascript而言,每个Firefox窗口都是一个完全独立的过程。

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

你将遇到的另一个问题是Windows需要一段时间才能启动并运行javascript,而且你没有像同步这样的东西。完全有可能窗口1检查窗口2是否创建了单例,看到它没有,窗口2检查窗口1,看到它没有,然后两者都创建自己的单例。

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

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

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