public interface IAnimal
{
string Run();
string Eat();
}
public class Dog:IAnimal
{
public string Run()
{
return "Dog Run";
}
public string Eat()
{
return "Dog Eat";
}
}
public class Cat:IAnimal
{
public string Run()
{
return "Cat Run";
}
public string Eat()
{
return "Cat Eat";
}
}
public class Bird:IAnimal
{
public string Run()
{
return "Bird Run";
}
public string Eat()
{
return "Bird Eat";
}
}
public enum AnimalType
{
Dog = 1,
Cat = 2,
bird = 3
}
public IAnimal Animal(AnimalType animalType)
{
IAnimal animal = null;
switch (animalType)
{
case AnimalType.Dog:
animal = new Dog();
break;
case AnimalType.Cat:
animal = new Cat();
break;
case AnimalType.bird:
animal = new Bird();
break;
default:
break;
}
return animal;
}
static void Main(string[] args)
{
AnimalFactory animalFactory = new AnimalFactory();
IAnimal animal = animalFactory.Animal(AnimalType.Cat);
Console.WriteLine(animal.Run());
Console.WriteLine(animal.Eat());
Console.ReadKey();
}
感觉各位前辈指正
------解决思路----------------------
在告诉你“工厂的概念其实很简单”之外,我就要对你的 public IAnimal Animal(AnimalType animalType) 这个方法的内容给你点出来,其实这里的设计是“坏了味道”的了!
你想想看,如果你为了避免别的地方写死“一堆腐朽”的switch...case语句,而设计了 Animal(AnimalType animalType) 这么一个可返回 IAnimal 子类实例对象的函数,可是你又把这个“腐朽的switch....case语句”弄到 这个方法中。这肯定还是没有真正解决你最应该解决的问题,而只是对原来的程序代码用“工厂方法”来隐藏了一层而已。
编程设计,我们自然是要尽可能地少写代码、少定义类型(包括接口)。其实我们强调要抽象、多态、工厂,并不是为了多弄出几层代码来,而是在兼顾当前必须面对的扩展性要求时还是要考虑实用性。否则就是为了模式而模式,反而更繁琐。
具体应该如何重构你的 Animal(AnimalType animalType) 内部的代码,我不给你写了。我觉得给你一个一个启发,让你能够思考“到底如何贯彻工厂方法的思想”,你会自己找到真正的实现的办法。
------解决思路----------------------
其实,可以这么搞,更加灵活一点
public IAnimal Animal(string animalName)
{
IAnimal animal = null;
//这里使用反射,通过类名实例化类
return animal;
}
调用
static void Main(string[] args)
{
AnimalFactory animalFactory = new AnimalFactory();
IAnimal animal = animalFactory.Animal(“Cat”);//动物类名称,可以配置在配置文件,实现灵活切换
Console.WriteLine(animal.Run());
Console.WriteLine(animal.Eat());
Console.ReadKey();
}