3

我正在开发一个摇摆应用程序,其中我有一个工厂类,它提供 Component 记住 Singleton。喜欢:

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())

我还创建了一个 ListenerFactory 类,它提供了 Swing/AWT 的各种监听器。

这种模式有什么缺陷吗?我可以将同一个组件或侦听器与两个同时可见的父组件一起使用吗?

提前致谢。

4

2 回答 2

8

它有一个重大缺陷:它通过使每个组件全局可访问来促进缺乏封装。这会很快导致意大利面条式代码,其中每个对象都使用任何其他对象,而不是提供封装方法的依赖项的简短列表。

另一个问题与实现有关:同步是不必要的,因为 Swing 组件不是线程安全的,并且只能从事件分派线程中使用。因此,您应该只让 EDT 调用您的方法,这使得同步变得不必要。

最后,一个组件可能只有一个父组件。例如,如果必须在两个不同的框架中显示相同的组件,则您将需要该组件的两个实例。

于 2012-02-19T10:15:21.433 回答
0

除了单例模式带来的耦合问题(= 程序中的许多类都依赖于您的工厂 -> 如果您的工厂发生更改,系统的许多部分都会受到影响。),您的单例工厂应该以多模式工作。线程上下文。

但注意不要优化它。有一种称为双重检查锁定的技术用于优化您的解决方案以获得更高程度的并发性,但它存在非常微妙的问题。如果您有兴趣,请参阅此声明(并注意签署它的人):http ://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

为了摆脱与工厂的耦合,我宁愿在一些顶级类中创建共享结构(表、侦听器、框架),这些类还创建需要引用这些结构的对象并传递结构到它们的构造函数中。但这只是一个建议,我不知道程序的整体结构。

于 2012-02-19T10:12:09.463 回答