单身过度使用

时间:2012-11-15 20:18:47

标签: c# winforms singleton

我正在考虑在我正在开发的winforms应用程序中使用Singleton模式,但是很多人似乎认为单身人士是邪恶的。我打算制作一个"主菜单"形式是单身人士。我无法想到任何我想要主菜单的多个实例的原因,并且它总是会出现的第一个表单,所以如果不必要地实例化我就不关心浪费资源。 / p>

此外,如果主菜单有多个实例,我可以看到出现的问题。例如,如果另一个表单有一个"主菜单"按钮和主菜单有多个实例,然后决定显示哪个实例似乎不明确。

另外,如果我有另一个winform,它必须查看程序的状态以确定是否已经存在主菜单的实例,那么我觉得我打破了模块化,尽管我可能错了。

在这种情况下,我是否应该避免使用单身人士,还是让主菜单保持静态更好?

我刚刚开始使用c#,在过去的几年中我对OOP做了很多事情,所以如果这是一个愚蠢的问题我会道歉。

由于

3 个答案:

答案 0 :(得分:1)

人们喜欢全球国家。它显然很容易理解,对我们来说很有意义。您不必担心使用哪个版本,因为它们都是相同的。

然而,全球状态引入了各种奇怪的错误,因此通常不鼓励。 C#做出了许多设计决策,使全球状态更难以错过使用。例如,允许静态变量仅附加到必须管理它们的类。

单身人士是获得这种全球状态的另一种方式,但它们相似,因为它们可能会导致问题。如果你的一个屏幕设置了主菜单的一部分然后过渡到它,而没有意识到后台进程解除了更改,导致显示一个奇怪的主菜单怎么办?

单身人士的另一种选择是确保变量到达需要的地方。一种方法是跟踪一堆菜单,事实上Android就像下面这样工作。每个UI都会获得一组位于其上方的父级,如果它想要返回,它可以切换到。通过确保只有初始启动过程创建初始主菜单屏幕,您可以保证只创建一个,但是所有屏幕仍然可以通过检查层次结构来访问它。

此外,如果您正在谈论winforms,他们已经内置了一个可用于提供此功能的层次结构系统。

答案 1 :(得分:1)

MainMenu是否一直显示?如果没有,那么在关闭时释放旧实例并在每次需要打开它时创建一个新实例是有意义的。这样,其他模块不需要知道它的实例,只需要在需要打开它时创建一个。

答案 2 :(得分:0)

你可以滥用几乎所有东西。

单例是一种保证任何时候只有一个对象实例处于活动状态的方法,您可以同步对它的访问。对于静态类,你会失去它,因为任何人都可以随时访问静态类,你需要确保你的方法不会做任何可能受并发影响的事情。

除此之外,如果我正确地读你,你想要一个可以作为父表单的表单来拥有你菜单的唯一实例,而所有其他形式都是这个表单的孩子。如果是这种情况,那么您应该检查Winforms中的MDI(多文档界面),因为这将恰好覆盖您的场景。

否则,我会做的只是为我的父窗体定义一个类(带有主菜单的那个)并且有一个单独的暴露加入它,并为所有子窗体使用另一个基类。