上一篇写了简单的工厂模式的实现,但是他还是有一个弊端,就是实体类通过继承,在子类中实现具体的功能,这样很好的做到了功能的可扩展,但是工厂类却是在类中通过switch来判断,对不同功能类的实例化是写死在工程类中的,这样一旦需要宽展就会修改该类。现在看下面的解决方案。
interface Animal
{
void Operate();
}
class Leg : Animal
{
public void Operate()
{
Console.WriteLine("i am a leg i can run");
}
}
class Mouse : Animal
{
public void Operate()
{
Console.WriteLine("i am a mouse i can eat");
}
}
interface Factory
{
Animal CreateAnimal();
}
class FactoryLeg : Factory
{
public Animal CreateAnimal()
{
return new Leg();
}
}
class FactoryMouse : Factory
{
public Animal CreateAnimal()
{
return new Mouse();
}
}
class Program
{
static void Main(string[] args)
{
Factory factory = new FactoryLeg();
Animal animal = factory.CreateAnimal();
animal.Operate();
Console.ReadKey();
}
}
这样就充分解决了上面提到的问题了,但是与此同时也有个相对于简单工厂模式的缺点,就是无法自动的选择去实例化那个功能类,这一点之前是在工厂类中的switch中做到的,看见这个设计模式也并非是完美的。
当然有一种方法可以在这个工厂方法模式中,根据具体的需要自动判断需要实例化的功能类,那就是反射
在客户端调用的
现在把上面的
Factory factory = new FactoryLeg();
替换成这一条代码Factory factory = (Factory)Assembly.Load("FactoryPattern").CreateInstance("FactoryPattern.FactoryLeg");
其效果是一样一样的,但是大家看得出来这条代码是用字符串来指定的,这样就可以很轻松的将用户输入的字符串组合成参数从而来指定要实例化的功能类了,是不是很强大啊。