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/

    本文版权归作者和博客园共有,欢迎转载。
    未经作者同意下,必须在文章页面明显标出原文链接及作者,否则保留追究法律责任的权利。
  • 相关阅读:
    (六)面向对象进阶
    (五)绑定方法与非绑定方法
    (四)封装
    (三)多态与多态性
    (二)继承与派生
    (一)面向对象的程序设计
    网络协议
    三.计算机网络简介
    二.计算机的发展史及多道技术
    一.计算机基础知识
  • 原文地址:https://www.cnblogs.com/gamash/p/4694059.html
Copyright © 2011-2022 走看看