2015-10-02 4 views
0

Мое приложение может иметь несколько тем, которые включают в себя кучу констант. Я думал использовать фабрику для создания темы и контрольных констант для разных тем в классе фабрики. Это хорошая практика для дизайна темы?Дизайн темы завод

class Theme { 
    public static final float LINE_WIDTH = 1; 
    public static final awt.Color SELECTED_LINE_COLOR = Color.YELLOW; 
    public static final awt.Color LINE_COLOR = Color.WHITE; 
    // some other constant variables or const objects 
} 

class ThemeFactory { 

    public static Theme getWhiteTheme() { 
    whiteTheme = new Theme(); 
    whiteTheme.LINE_WIDTH = 2; 
    whiteTheme.SELECTED_LINE_COLOR = Color.RED; 
    whiteTheme.LINE_COLOR = Color.BLACK; 

    return whiteTheme; 
    } 

    public static Theme getBlackTheme() { 
    return new Theme(); // Theme class default settings are for black theme. 
    } 

} 


class MyApplication { 

    Theme currentTheme; 

    MyApplication() { 

    // get theme settings from preference store 
    if (themeSettingInPrefStore.isWhiteTheme) { 
     currentTheme = ThemeFactory.getWhiteTheme(); 
    } else if (themeSettingInPrefStore.isBlackTheme) { 
     currentTheme = ThemeFactory.getBlackTheme(); 
    } 

    } 

} 
+1

Я бы, вероятно, использовал файлы свойств (или, возможно, файлы xml). Возможно, 'themes/default/theme.prop',' themes/black/theme.prop' и 'themes/white/theme.prop'. Где «черный» и «белый» переопределяют значения в «default», поэтому могут оставаться минимальными. Используя такие папки, вы могли бы также переопределить изображения и т. Д. –

+0

Вы также собираетесь добавить 'getGreenTheme()'? Как насчет 'getBlueTheme()'? Что, если какой-нибудь придурок через несколько лет решит, что белая тема должна быть изменена на красный? Вызов 'getWhiteTheme()' затем даст вам красную тему. Почему бы не использовать один метод getTheme (Цвет, Цвет), который создает тему, основанную на цветах, которые вы передаете вместо этого? – JonK

+0

@LanceJava, мне нравится идея. Я на самом деле думал об этом, однако с немного другой версией - используйте класс BaseTheme и получайте с помощью BlackTheme/WhiteTheme. Так как мне может потребоваться некоторое программное обеспечение. В таком случае, должен ли я сделать BaseTheme и производный класс всем конкретным классом? – Stan

ответ

2

Нет, это не так.

Тема не имеет абстракции, а члены являются общедоступными и статическими. Что делать, если какой-то средний программист что-то изменяет во время работы приложения? То, что вы возвращаете новую тему(), бесполезно.

Расширяемость также отстой^H^H^H^H^H находится здесь в опасности. Что, если завтра кто-то захочет тему BlackAndWhite?

Защитить тему с помощью геттеров. Устраните это ThemeFactory и превратите его в синглтон или что-то в этом роде (я знаю, некоторые люди сходят с ума, когда слышат слово сиглтон). Если тема становится сложной, используйте Builder (GoF), чтобы загрузить ее из своего хранилища предпочтений.

Смежные вопросы