单身是否适合这种设计?

Nic*_*bey 0 java singleton design-patterns

我的模型已经实现,我正在研究一个视图.

我有一个名为Helper的类,它是我的控制器的一部分.Helper类的目的是包含模型的"主副本".其他类将调用Helper方法来请求他们自己的模型副本(整个或特定部分).Helper也是唯一允许对模型进行更改的类.

我正在处理的视图包含一个名为DrawingPanel的JPanel.DrawPanel的paint()方法被覆盖,以便在绘制自己之前从Helper检索模型.

将Helper类实现为单例是实现此目标的最佳方法,还是有更好/更简单/更优雅的方式来实现我的目标?

我想我也应该提前知道我的Helper作为单例的实现是否需要线程安全.gui是在Swing中设计的.

cHa*_*Hao 5

至于资本-S"单身人士"是否合适......问问自己这个......

第二个例子肯定会导致我的程序死亡吗?

(我的意思是"确定"和"死亡".不只是"可能"......而不仅仅是关于哪个实例是"官方"的混淆.如果程序崩溃,内爆,打开虫洞,放火烧你的狗等完全由于第二个实例的存在,答案是"是".如果你不确定,假设"不",直到你有合理的证据.)

如果答案是"是",那么您可能有一个使用Singleton的有效案例.如果没有,那么你就是在滥用它,并且有一个更好的解决方案: 只是不要创建第二个实例.

使用Singleton有几个误导的原因:

  • "我希望能够使用我的对象,而无需在应用程序周围传递它." 你猜怎么着?你所拥有的是一个美化的全球变量.当它隐藏在某个阶级的内容中时,它会更加邪恶,而不是让全世界都能看到它. 如果你想使用全局,那么使用一个怪异的全局. 不要把它隐藏在吸气剂后面,并认为人们不会注意到.

  • "我只需要其中一个." 往上看. 你只需要一个?只创建一个. 无论你现在是否需要它,你有充分的理由强迫那里只有一个吗?如果你将来想要另一个怎么办?你不仅创造了另一个创建它的痛苦,而且你可能以这样的方式构建你的类,只有一个可以存在 - 并且将有很多"设计"来撤消.

  • "能够说出来很方便MySingleton.getInstance()." 是的,直到你开始关心测试.请注意,每次调用时MySingleton.getInstance(),您都会再添加一个假设,即该对象可能是唯一的类型.如果您开始搞乱单元测试,那么您的测试将毫无用处,因为它们都依赖于该实例的行为 - 甚至是测试运行的顺序.即使是全局性也没有可测试性那么糟糕,而且有点糟糕.(另外,请参阅上面的"...不要在应用程序周围传递它".)

单身问题的解决方案通常是依赖注入.大字,但非常简单的前提; 非框架版本基本上是"对象需要完成其工作的外部东西?将它传递给构造函数." 有一些DI容器库/软件包据说可以简化这一点,但它只是告诉对象要使用什么而不是让它自己去找东西.因此,您将一个实例传递给需要它的对象,它永远不必说出MySingleton.任何内容 - 甚至不关心该对象是否是单例.