在许多时候,我们经常会碰到这样的问题:
根据给定的条件来生成不同的对象,我一般是这样:
class
BaseClass{
public abstract void Do();
}
class Class1 : BaseClass{
public override void Do(){
}
}
class Class2 : BaseClass{
public override void Do(){
.
}
}
public abstract void Do();
}
class Class1 : BaseClass{
public override void Do(){
}
}
class Class2 : BaseClass{
public override void Do(){
.
}
}
再做一个工厂类根据不同的条件生成不同的对象:
class
Factory{
public static BaseClass Create(){
// get conditons
if (conditon == 1 ){
return new Class1();
}
else if (condition == 2 ){
return new Class2();
}
}
public static BaseClass Create(){
// get conditons
if (conditon == 1 ){
return new Class1();
}
else if (condition == 2 ){
return new Class2();
}
}
用的时候可以这样:
class
Client{
public void Process(){
BaseClass bc = Factory.Create();
bc.Do();
}
}
public void Process(){
BaseClass bc = Factory.Create();
bc.Do();
}
}
但是有人在看了这段代码之后,说里面有if...else...,而面向对象的编程中可以利用设计模式来替换掉if...else...的代码,而代码中出现if...else...则意味着Bad Smell。可我不明白如何来替换这段代码,用抽象工厂吗?具体的工厂类是可以直接生成产品了,但是对条件的判断代码又转移到到底采用哪个具体工厂上去。
有人有好办法吗?