C#设计模式之工厂方法与简单工厂

※ 工 厂 方 法

     不同的执行子类有自己专属的工厂,相互之间无影响.

※ 简 单 工 厂

      所有执行子类共享一个工厂类,每增加一个执行子类需要对工厂类进行改写,即增加一个case;

      (注意:简单工厂违反了设计模式的开闭原则,所以属于一种特殊的设计模式)

 

工厂方法   C# 代码

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //AbsFactory _facApple = new AppleFac();
 6             // AbsFruits _Apple = _facApple.CreatFruitBy();
 7             AbsFruits _Apple = new AppleFac().CreatFruitBy();//对上面两行的简写
 8             _Apple.CreateFruit();
 9 
10             Console.ReadKey();
11         }
12     }
13        
14         //工厂父类
15          public abstract class AbsFactory
16         {
17          public abstract AbsFruits CreatFruitBy();
18         }
19 
20         //水果商父类
21          public abstract class AbsFruits
22          {
23              public abstract void CreateFruit();
24          }
25 
26         class Apple:AbsFruits{
27             public override void CreateFruit()
28             {
29                 Console.WriteLine("apple");
30             }            
31         }
32         class AppleFac : AbsFactory
33         {
34             public  override AbsFruits CreatFruitBy()
35             {
36                 return new Apple();
37             }
38         }
39 
40         class Banana : AbsFruits
41         {
42             public override void CreateFruit()
43             {
44                 Console.WriteLine("banana");
45             }
46         }
47         class BananaFac : AbsFactory
48         {
49             public override AbsFruits CreatFruitBy()
50             {
51                 return new Banana();
52             }
53         }
54     

简单工厂方法   C# 代码

 

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Fruits _fruitA = Factory.CreateFruitsBy("Apple");
 6             _fruitA.CreatFruit();
 7             Fruits _fruitB = Factory.CreateFruitsBy("Banana");
 8             _fruitB.CreatFruit();
 9 
10             Console.ReadKey();
11         }
12     }
13 
14     //工厂
15     class Factory {
16         public static Fruits CreateFruitsBy(string fruitName) {
17             Fruits returnValue;
18             switch (fruitName)
19             {
20                 case "Apple":
21                     returnValue=new Apple();
22                     return returnValue;
23                    
24                 case "Banana":
25                      returnValue=new Banana();
26                      return returnValue;                                 
27             }
28             return null;
29         }
30     }
31 
32     //基类
33     abstract class Fruits { 
34         public abstract void CreatFruit();
35     }
36 
37     //派生类
38     class Apple : Fruits {
39         public override void CreatFruit()
40         {
41             Console.WriteLine("apple");
42         }
43     }
44 
45     //派生类
46     class Banana : Fruits {
47         public override void CreatFruit()
48         {
49             Console.WriteLine("banana"); 
50         }
51     }

 

posted @ 2018-11-01 16:21  RainPainter雨画  阅读(274)  评论(0编辑  收藏  举报