当前位置: 代码迷 >> C# >> 新学者求教,小弟我这个算是工厂吗
  详细解决方案

新学者求教,小弟我这个算是工厂吗

热度:44   发布时间:2016-05-05 03:16:14.0
新学者求教,我这个算是工厂吗?
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();
        }
  相关解决方案