从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
该模式中包含的角色及其职责
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
1 namespace 简单工厂 2 { 3 public enum HumanColor {White,Black,Yellow} 4 5 public abstract class Human 6 { 7 public abstract void GetHumanColor(); 8 public abstract void Speak(); 9 } 10 } 11 12 namespace 简单工厂 13 { 14 public class WhiteHuman:Human 15 { 16 public override void GetHumanColor() 17 { 18 Console.WriteLine("人种颜色为:{0}",HumanColor.White); 19 } 20 21 public override void Speak() 22 { 23 Console.WriteLine("我是白人,我骄傲!"); 24 } 25 } 26 } 27 28 namespace 简单工厂 29 { 30 public class BlackHuman:Human 31 { 32 public override void GetHumanColor() 33 { 34 Console.WriteLine("人种颜色为:{0}", HumanColor.Black); 35 } 36 37 public override void Speak() 38 { 39 Console.WriteLine("我是黑人,我骄傲!"); 40 } 41 } 42 } 43 44 namespace 简单工厂 45 { 46 public class YellowHuman:Human 47 { 48 public override void GetHumanColor() 49 { 50 Console.WriteLine("人种颜色为:{0}", HumanColor.Yellow); 51 } 52 53 public override void Speak() 54 { 55 Console.WriteLine("我是黄种人,我骄傲!"); 56 } 57 } 58 } 59 60 namespace 简单工厂 61 { 62 public class HumanFactory 63 { 64 public static Human CreateHuman(HumanColor color) 65 { 66 if (color == HumanColor.White) 67 { 68 return new WhiteHuman(); 69 } 70 else if (color == HumanColor.Black) 71 { 72 return new BlackHuman(); 73 } 74 else 75 { 76 return new YellowHuman(); 77 } 78 } 79 } 80 } 81 82 namespace 简单工厂 83 { 84 class Program 85 { 86 static void Main(string[] args) 87 { 88 //创建白种人 89 Human human1 = HumanFactory.CreateHuman(HumanColor.White); 90 human1.GetHumanColor(); 91 human1.Speak(); 92 93 //创建黑人 94 Human human2 = HumanFactory.CreateHuman(HumanColor.Black); 95 human2.GetHumanColor(); 96 human2.Speak(); 97 98 //创建黄种人 99 Human human3 = HumanFactory.CreateHuman(HumanColor.Yellow); 100 human3.GetHumanColor(); 101 human3.Speak(); 102 103 Console.ReadKey(); 104 } 105 } 106 }