繁体   English   中英

这种情况是否需要使用单例模式?

[英]Does this situation warrant using the singleton pattern?

我正在创建一个微型软件应用程序,如果您愿意,它将使用多个“菜单屏幕”。 例如; 主菜单屏幕,登录屏幕以及该应用程序支持的所有不同功能的屏幕。 我目前正在使用以下类处理此问题:

public class ScreenUpdater {

    public static void updateScreen(JPanel screen, JFrame frame) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                frame.remove(frame.getContentPane().getComponent(0));
                frame.getContentPane().add(screen);
                frame.invalidate();
                frame.revalidate();
            }
        });

    }

}

静态方法updateScreen()采用以下参数:

  • 出现在JFrame中的新屏幕(例如,新的LoginScreen(MainScreen mainScreenRef))(请注意,LoginScreen引用了主屏幕,因此它本身可以引用原始JFrame)。
  • 将在其中显示新屏幕的JFrame。

这对我来说很好,但是我发现我认为有问题。 例如,登录屏幕将在按下按钮时调用另一个屏幕,所有这些操作都将在按钮的调用方法内发生,使我相信即使未显示登录屏幕,该屏幕仍然存在并带有有效的引用。 此外,在两次返回同一屏幕时,新实例将堆积起来,垃圾回收器将无法处理以前的实例,因为它们在堆栈中的位置较低。

为了解决这个问题,我相信可以使用Singleton设计模式。

我对大家的问题是(按重要性排序):

  • 我对这些实例化的想法是否正确?
  • 如果是这样,这是使用Singleton模式的理想情况还是有更好的解决方案?
  • 这种方法本身仅仅是一种极差的方法吗?

提前非常感谢大家!

澄清 -当我提到垃圾回收问题时,这就是我的意思。 假设我们有一个名为LoginScreen()的类,并带有一个名为login()的方法。 方法login()实例化MainMenu()类,以便现在可以将其显示在JFrame中。 在原始login()方法完成之前,将调用从MainMenu()类调用的所有方法。 这就是让我相信垃圾收集器不会收集原始LoginScreen()的原因。

简短的答案是不,这听起来不像是使用单例的理由。

您曾经说过,即使没有显示这些实例,您也会担心它们会停留在这些屏幕上:是什么让您相信呢? 如果您对它们没有任何引用,那么它们将有资格进行垃圾回收。 一旦方法退出,并假设您没有对屏幕的任何其他引用,则该对象将有资格进行垃圾回收。

但是,所有这些听起来还是CardLayout的工作。

如果您需要更多信息,请发布MCVE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM