设计一个主题工厂

Design a theme factory

我的应用程序可以有多个主题,其中只包含一堆常量。我在考虑使用工厂来为工厂中的不同主题生成主题和控制常量 class。这是主题设计的好习惯吗?

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

  }

}

不,不是。

主题缺乏抽象,成员是public和静态的。如果一些普通程序员在应用程序 运行 时更改某些内容怎么办? 您返回 new Theme() 的事实是无用的。

可扩展性也很糟糕^H^H^H^H^H 在这里处于危险之中。如果明天有人想要黑白主题怎么办?

用吸气剂保护主题。消除 ThemeFactory 并将其转换为单例或其他东西(我知道,有些人在听到 sigleton 这个词时会发疯)。如果主题变得复杂,请使用 Builder (GoF) 从您的偏好商店加载它。