设计模式需要在对象初始化中删除一系列If .. else

时间:2011-08-04 19:15:55

标签: java design-patterns abstract-factory

我正在编写一个应用程序,其中将有多个部门,每个部门将有单独的处理类。 每个部门和部门的处理都由单独的类表示。

所以,现在java中的main方法看起来更像是if else ladder的系列。

有没有办法让它更灵活,以便我可以在以后添加更多部门及其处理类而无需修改原来的类很多?

我已经阅读过有关抽象工厂模式但是还有其他解决方案吗?

5 个答案:

答案 0 :(得分:2)

创建一个隐藏部门的界面,例如“部门”。写下你的主要方法,如:

main() {
    String criteria = ...; // this is how we choose the department to use,
                           // and you probably don't want to use a String
                           // but some other, more expressive type
    for (Department department : departments) {
        if (department.supports(criteria)) {
            department.doWhatever();
        }
    }
}

然后使用依赖注入来填充departments集合。根据您的设置方式,它可能是纯粹的配置。

答案 1 :(得分:1)

有一个专门讨论该主题的网站。你想根据你想要做的事情使用多态和可能的反射。

http://www.antiifcampaign.com/

答案 2 :(得分:1)

您可以为每个州创建包含字段的枚举。然后在枚举中创建抽象方法init()并为每个成员实现它。

在您的代码中,您可以从例如属性文件中获取状态,然后说出State.valueOf(state).init()

答案 3 :(得分:1)

抽象工厂模式可能最适合您描述的方案。你需要一个部门处理器的层次结构和一个匹配的部门类的层次结构。抽象工厂将根据一些鉴别器为每一对生产一个混凝土工厂,为您处理部门并返回Department对象。

你的应用程序的其余部分不需要知道部门对象创建的差异,因为它将使用FActory让部门简单地传递适当的鉴别器。

添加新部门将需要新的部门分类,处理器类和更新工厂逻辑。


或者,如果部门的结构完全相同但处理不同,您可以考虑使用策略模式之类的东西。在这种情况下,您只有一个部门,但有关处理的决定将改为策略。因此,适当的策略被注入部门,部门的行为也相应地不同。

答案 4 :(得分:1)

使用“工厂”或“抽象工厂”设计模式将是第一步。这将使对象初始化逻辑脱离主代码并在工厂类中将其隔离。这样,您的主代码将被关闭以进行修改并打开以进行扩展(a.k.a。Open Closed Principle)。您所做的更改将在工厂类中隔离。

如果您想更进一步,您也可以使用反射。一个例子是:

static Object createObject(String className) {
  Object object = null;
  try {
      Class classDefinition = Class.forName(className);
      object = classDefinition.newInstance();
  } catch (InstantiationException e) {
      System.out.println(e);
  } catch (IllegalAccessException e) {
      System.out.println(e);
  } catch (ClassNotFoundException e) {
      System.out.println(e);
  }
  return object;
}

使用此代码,您只需创建一个这样的对象:

public static void main(String[] args) {
    NewDepartment dep = (NewDepartment) createObject("yourpackage.NewDepartment");
}

当然,使用反射时会有trade-off。您可以自行决定是否使用它。