我有一个这样的例子
class A {
A() {}
public C createC () {
...
}
}
class B {
B() {}
public C createC () {
}
}A和B的对象是基于
public enum D { ii, jj };我看到到处都是代码,比如
D d;
switch (d) {
case ii: (new A()).createC(); break;
case jj: (new B()).createC(); break;
};我怎样才能避免到处都是开关的情况?我知道代码不是很清楚。
发布于 2010-10-19 10:30:08
我倾向于将create代码添加到枚举中。
enum D {
ii {
public void createC() { new A().createC(); }
},
jj {
public void createC() { new B().createC(); }
};
public abstract void createC();
}然后,您可以将开关替换为
d.createC();话虽如此,我还会考虑使createC方法成为静态方法,或者将createC代码移到枚举中,而不是将其留在A和B类中。
如果将A和B中的createC方法设为静态,则枚举将如下所示
enum D {
ii {
public void createC() { A.createC(); }
},
jj {
public void createC() { B.createC(); }
};
public abstract void createC();
}发布于 2010-10-19 08:09:52
您可以只创建一个Factory类:
public class ClassFactory {
public static C createC(D type) {
C c = null;
switch (type) {
case ii:
c = new A();
break;
case jj:
c = new B();
break;
};
return c;
}
}然后在你的代码中这样做:
C c = ClassFactory.createC(type);与Factory method pattern的维基词条对其PizzaFactory所做的非常相似。
发布于 2010-10-19 08:12:41
我在这里看不到重构的机会。
我认为有必要建一座工厂。查找“工厂”设计模式。
我看到到处都是代码,就像...(后面跟着一个条件,其中创建了一个特定的实例)_是一个巨大的提示。
基本上,你要做的就是把决定实例化哪个类的所有丑陋的事情都推到一个地方。首先,在您的示例中,A和B应该共享一个超类,或者更好地实现一个定义了public C createC()的接口。
工厂只不过是一个带有静态方法的类,它决定实例化哪个A或B。
public class SomeFactory {
public static YourInterface make(int someNumber) {
switch (someNumber) {
case 1: return new A();
case 2: return new B();
default:
throw new RuntimeException("unknown type");
}
}
}所以你要做的是:
YourInterface yi = SomeFactory.make(1);
C c = yi.createC();或
C c = SomeFactory.make(1).createC();现在你的代码已经很干净了。是否创建SomeInterface的新实现?没问题,将它的创建添加到工厂中,您的代码仍然可以工作。如果对于你的应用程序来说,make()是昂贵的,没有问题,只需制作一个并重复使用它。
https://stackoverflow.com/questions/3964419
复制相似问题