1 namespace UnitTestProject1.BaseDesign
2 {
3
4 /// <summary>
5 /// 工厂方法模式要求:尽量使用抽象类或接口来定义就可以达到一个开闭原则
6 /// </summary>
7 [TestClass]
8 public class BaseDesign
9 {
10 [TestMethod]
11 public void TestMethod1()
12 {
13 GetAnimalEat(new DogFactoryFactory());
14
15 GetAnimalEat(new PigFactoryFactory());
16
17 //如果再增加一个AnimalEat不会对现有代码有改动
18 }
19
20 void GetAnimalEat(AnimalFactory fa)
21 {
22 Animal am = fa.GetAnimal();
23 am.Eat();
24 }
25
26 }
27 public abstract class Animal
28 {
29 public abstract void Eat();
30 }
31
32 public class Dog : Animal
33 {
34 public override void Eat()
35 {
36 Console.WriteLine("dog eat");
37 }
38 }
39
40 public class Pig : Animal
41 {
42 public override void Eat()
43 {
44 Console.WriteLine("pig eat");
45 }
46 }
47
48 public abstract class AnimalFactory
49 {
50 public abstract Animal GetAnimal();
51 }
52
53 public class DogFactoryFactory : AnimalFactory
54 {
55 public override Animal GetAnimal()
56 {
57 return new Dog();
58 }
59
60 }
61 public class PigFactoryFactory : AnimalFactory
62 {
63 public override Animal GetAnimal()
64 {
65 return new Pig();
66 }
67 }
68 }