首先,需要知道一下概念:
引用自百度百科:http://baike.baidu.com/link?url=sdhCJ2qSWiGSykDoam76UU15trXfZbfeEr304FgAFUOzlVdsZ_CZcXz7mNS2yYAmUMo1b61oMb-uB2dSwxV8V_
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
由此可见,简单工厂模式并不属于23种设计模式,可以说是工厂模式的一种简化版吧。
简单工厂模式将同一类型的方法通过条件判断,进而实例化不同的对象,已达到最终的目的,通过简单工厂,解决了方法之间的高耦合,降低耦合度,提高方法的复用程度。
代码实现:
首先提出一个具体的例子:小明想从苏州去南京旅游,可以坐火车,也可以坐汽车,也可以坐飞机,那么问题来了,这个场景如何通过代码实现?
旅游方式类
1 public class Tourism 2 { 3 public string ByTrain(string from, string to) 4 { 5 return string.Format("小明想坐火车从{0}去{1}。", from, to); 6 } 7 8 public string ByBus(string from, string to) 9 { 10 return string.Format("小明想坐汽车从{0}去{1}。", from, to); 11 } 12 13 public string ByPlane(string from, string to) 14 { 15 return string.Format("小明想坐飞机从{0}去{1}。", from, to); 16 } 17 }
调用方式
1 public static void Main(string[] args) 2 { 3 string from = "苏州"; 4 string to = "南京"; 5 Console.WriteLine(new Tourism().ByTrain(from, to)); 6 Console.WriteLine(new Tourism().ByBus(from, to)); 7 Console.WriteLine(new Tourism().ByPlane(from, to)); 8 }
分析一下上面的实现方式:
旅游方式类中分别实现了火车、汽车、飞机的三个方式,这么做虽然代码量很少,但是不利于扩展,例如去南京还可以高铁、骑行等等,如果按照上述的逻辑,那么,每新增一种方式都需要增加一个方法,久而久之不利于维护。而在这整个逻辑中,只有出行的方式不同,其余都是可以通过一个方法去实现的。
现在利用简单工厂模式来实现上述的例子:
1 public class Travel 2 { 3 public virtual string GetTravelType(string from, string to) 4 { 5 return string.Empty; 6 } 7 } 8 9 public class Train : Travel 10 { 11 public override string GetTravelType(string from, string to) 12 { 13 return string.Format("小明想坐火车从{0}去{1}。", from, to); 14 } 15 } 16 17 public class Bus : Travel 18 { 19 public override string GetTravelType(string from, string to) 20 { 21 return string.Format("小明想坐汽车从{0}去{1}。", from, to); 22 } 23 } 24 25 public class Plane : Travel 26 { 27 public override string GetTravelType(string from, string to) 28 { 29 return string.Format("小明想坐飞机从{0}去{1}。", from, to); 30 } 31 } 32 33 public class TravelFactory 34 { 35 public Travel CreateTravelType(string type) 36 { 37 Travel travel = new Travel(); 38 switch (type) 39 { 40 case "Train": travel = new Train(); break; 41 case "Bus": travel = new Bus(); break; 42 case "Plane": travel = new Plane(); break; 43 } 44 return travel; 45 } 46 }
调用方式
1 public static void Main(string[] args) 2 { 3 string from = "苏州"; 4 string to = "南京"; 5 Console.WriteLine(new TravelFactory().CreateTravelType("Train").GetTravelType(from, to)); 6 Console.WriteLine(new TravelFactory().CreateTravelType("Bus").GetTravelType(from, to)); 7 Console.WriteLine(new TravelFactory().CreateTravelType("Plane").GetTravelType(from, to)); 8 }
如果需要添加一种出行方式,只需要新增一个类继承Train类并重写GetTravelType方法,在工厂方法内加一个case分支即可。
总结
简单工厂模式对一类方法进行了包装,将这些方法的调用放在了工厂类中,调用者只需要了解如何去获取需要的对象,使用的方法都是相同的,便于后期对方法进行扩展和新增。虽然这些优势很明显,但缺点也是有的,因此简单工厂模式仅适用于某些特定的场景。
原文链接:http://www.cnblogs.com/gamash/p/4694059.html
作者:Mr.Gilgamash 出处:http://gamash.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载。
未经作者同意下,必须在文章页面明显标出原文链接及作者,否则保留追究法律责任的权利。
|