Синглтон Свинг Компонент - PullRequest
3 голосов
/ 19 февраля 2012

Я занимаюсь разработкой свинг-приложения, в котором у меня есть класс Factory, который предоставляет компонент с учетом 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.

Этошаблон имеет какие-либо недостатки?Могу ли я использовать один и тот же компонент или прослушиватель с двумя одновременно видимыми родительскими компонентами?

Заранее спасибо.

Ответы [ 2 ]

8 голосов
/ 19 февраля 2012

У него есть большой недостаток: он способствует отсутствию инкапсуляции, делая каждый компонент глобально доступным. Это может очень быстро привести к спагетти-коду, где каждый объект использует любой другой объект, вместо того, чтобы иметь короткий список зависимостей, обеспечивающих инкапсулированные методы.

Другая проблема связана с реализацией: синхронизация не нужна, поскольку компоненты Swing не являются поточно-ориентированными и могут использоваться только из потока диспетчеризации событий. Таким образом, вы должны иметь только EDT, вызывающий ваши методы, что делает ненужной синхронизацию.

Наконец, компонент может иметь только один родительский компонент. Например, если один и тот же компонент должен отображаться в двух разных кадрах, вам понадобятся два экземпляра этого компонента.

0 голосов
/ 19 февраля 2012

Помимо проблем связывания, связанных с одноэлементным шаблоном (= многие классы в вашей программе зависят от вашей фабрики -> Если ваша фабрика изменится, затронуты многие части вашей системы.), Ваша фабрика-одиночка должна работатьмногопоточный контекст.

Но будьте осторожны, чтобы не оптимизировать его.Существует методика, называемая двойной проверкой блокировки, которая использовалась для оптимизации вашего решения, чтобы получить более высокую степень параллелизма, но она имеет очень тонкие проблемы.Если вам интересно, посмотрите это объявление (и обратите внимание на людей, которые его подписали): http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

Чтобы избавиться от связи с вашей фабрикой, я бы лучше создал общие структуры (таблицы, слушатели, фреймы)в некотором классе (ах) верхнего уровня, которые также создают объекты, которым нужны ссылки на эти структуры, и передают структуры в свои конструкторы.Но это всего лишь совет, я не знаю общей структуры программы.

...