簡體   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