我正在编写一个应用程序,其中将有多个部门,每个部门都有单独的处理类。每个部门和部门处理由单独的类表示。
所以,现在java中的main方法看起来更像是一系列if else阶梯。
有什么办法让它更灵活,这样我以后就可以添加更多的部门和他们的处理类,而不需要对原来写的类做太多修改??
我读过抽象工厂模式,但除了它还有其他解决方案吗?
我正在编写一个应用程序,其中将有多个部门,每个部门都有单独的处理类。每个部门和部门处理由单独的类表示。
所以,现在java中的main方法看起来更像是一系列if else阶梯。
有什么办法让它更灵活,这样我以后就可以添加更多的部门和他们的处理类,而不需要对原来写的类做太多修改??
我读过抽象工厂模式,但除了它还有其他解决方案吗?
创建一个隐藏部门的界面,例如“部门”。编写您的主要方法,例如:
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
集合。根据您的设置方式,它可能是纯配置。
抽象工厂模式可能最适合您描述的场景。您将需要部门处理器的层次结构和部门类的匹配层次结构。抽象工厂将根据一些判别器为每一对生成一个具体工厂,为您处理部门并返回部门对象。
您的应用程序的其余部分不需要了解部门对象创建的差异,因为它将使用工厂简单地通过适当的鉴别器来获取部门。
添加新部门将需要新的部门类、处理器类和更新工厂逻辑。
或者,如果部门的结构都相同但处理不同,您可以考虑使用类似策略模式的东西。在这种情况下,您只有一个部门,但有关处理的决定将由战略来代替。因此,适当的Strategy被注入到部门中,部门的行为也随之不同。
有一个专门讨论该主题的网站。您想使用多态性和可能的反射,具体取决于您要执行的操作。
您可以为每个州创建带有字段的枚举。然后在枚举中创建抽象方法init()
并为每个成员实现它。
在您的代码中,您可以从例如属性文件中获取状态,然后说State.valueOf(state).init()
第一步是使用“工厂”或“抽象工厂”设计模式。这会将对象初始化逻辑从主代码中取出,并将其隔离在工厂类中。这样,您的主要代码将被关闭以进行修改并打开以进行扩展(又名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");
}
当然,使用反射时需要权衡取舍。这取决于您是否使用它。