zoukankan      html  css  js  c++  java
  • 设计模式学习之路——简单工厂模式

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

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

    本文版权归作者和博客园共有,欢迎转载。
    未经作者同意下,必须在文章页面明显标出原文链接及作者,否则保留追究法律责任的权利。
  • 相关阅读:
    c语言结构体数组引用
    c语言结构体数组定义的三种方式
    如何为SAP WebIDE开发扩展(Extension),并部署到SAP云平台上
    SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
    使用SAP API portal进行SAP SuccessFactors的API测试
    SAP UI5应用里的页面路由处理
    在SAP WebIDE Database Explorer里操作hdi实例
    如何使用SAP事务码SAT进行UI应用的性能分析
    使用SAP WebIDE进行SAP Cloud Platform Business Application开发
    SAP CRM WebClient UI ON_NEW_FOCUS的用途
  • 原文地址:https://www.cnblogs.com/gamash/p/4694059.html
Copyright © 2011-2022 走看看