3

シングルトンを念頭に置いてコンポーネントを提供するファクトリクラスがあるswingアプリを開発しています。好き:

public final class ComponentFactory {
    private static LibraryFrame libraryFrame;
    private static LibraryTableScrollPane libraryTableScrollPane;

    public static synchronized LibraryFrame getLibraryFrame() {
        if (libraryFrame == null) {
            libraryFrame = new LibraryFrame();
        }
        return libraryFrame;
    }

    public static synchronized LibraryTableScrollPane getLibraryTableScrollPane() {     
        if(libraryTableScrollPane == null) {
            libraryTableScrollPane = new LibraryTableScrollPane(getLibraryTable());
        }       
        return libraryTableScrollPane;
    }
}

私はこのコンポーネントを次のように使用しています:

add(ComponentFactory.getLibraryTableScrollPane())

また、Swing/AWTのさまざまなリスナーを提供するListenerFactoryクラスを作成します。

このパターンに欠陥はありますか?同じコンポーネントまたはリスナーを、同時に表示される2つの親コンポーネントとともに使用できますか?

前もって感謝します。

4

2 に答える 2

8

これには大きな欠陥があります。すべてのコンポーネントをグローバルにアクセスできるようにすることで、カプセル化の欠如を促進します。これにより、カプセル化されたメソッドを提供する依存関係の短いリストを作成する代わりに、すべてのオブジェクトが他のオブジェクトを使用するスパゲッティコードがすぐに発生する可能性があります。

もう1つの問題は、実装にあります。Swingコンポーネントはスレッドセーフではなく、イベントディスパッチスレッドからのみ使用できるため、同期は不要です。したがって、EDTがメソッドを呼び出すだけで、同期が不要になります。

最後に、コンポーネントには親コンポーネントが1つしかない場合があります。たとえば、同じコンポーネントを2つの異なるフレームに表示する必要がある場合は、このコンポーネントの2つのインスタンスが必要になります。

于 2012-02-19T10:15:21.433 に答える
0

シングルトンパターンに伴う結合の問題は別として(=プログラム内の多くのクラスはファクトリに依存しています->ファクトリが変更されると、システムの多くの部分が影響を受けます)、シングルトンファクトリはマルチで動作するはずです。スレッド化されたコンテキスト。

ただし、最適化しないように注意してください。ソリューションを最適化してより高度な同時実行性を実現するために使用されたダブルチェックロックと呼ばれる手法がありますが、非常に微妙な問題があります。興味がある場合は、この宣言を参照してください(そして署名した人に注意してください):http ://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

ファクトリへの結合を取り除くために、これらの構造への参照を必要とするオブジェクトを作成し、これらの構造を渡すいくつかのトップレベルクラスに共有構造(テーブル、リスナー、フレーム)を作成したいと思います。コンストラクターへの構造。しかし、それは単なるアドバイスであり、プログラムの全体的な構造はわかりません。

于 2012-02-19T10:12:09.463 に答える