首先,需要知道一下概念:

引用自百度百科: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     }
Code

调用方式

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         }
Code

 

分析一下上面的实现方式:

旅游方式类中分别实现了火车、汽车、飞机的三个方式,这么做虽然代码量很少,但是不利于扩展,例如去南京还可以高铁、骑行等等,如果按照上述的逻辑,那么,每新增一种方式都需要增加一个方法,久而久之不利于维护。而在这整个逻辑中,只有出行的方式不同,其余都是可以通过一个方法去实现的。

现在利用简单工厂模式来实现上述的例子:

 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     }
Code

 

调用方式

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         }
Code

 

如果需要添加一种出行方式,只需要新增一个类继承Train类并重写GetTravelType方法,在工厂方法内加一个case分支即可。


总结

简单工厂模式对一类方法进行了包装,将这些方法的调用放在了工厂类中,调用者只需要了解如何去获取需要的对象,使用的方法都是相同的,便于后期对方法进行扩展和新增。虽然这些优势很明显,但缺点也是有的,因此简单工厂模式仅适用于某些特定的场景。

原文链接:http://www.cnblogs.com/gamash/p/4694059.html

作者:Mr.Gilgamash 出处:http://gamash.cnblogs.com/

本文版权归作者和博客园共有,欢迎转载。
未经作者同意下,必须在文章页面明显标出原文链接及作者,否则保留追究法律责任的权利。