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 }