【浅读设计模式】之 简单工厂模式

  吐槽:上班工作为生活,下班读书是爱好!技术需要的是经验,而不是凭借工作年限来证明些什么。

  最近在看程杰著作的《大话设计模式》,全书以小菜和大鸟对话的形势,由浅入深的讲解程序的设计思想,影射出一个个设计模式。感慨作者妙笔生花的同时,也思量自己的不足。我们中的很多程序猿,做的是二次开发的事情。因为一般公司都是有一个成熟的产品,或者公司不会冒险让你做一个全新的项目。这些设计模式也不一定能用得上,但这些设计模式让自己对OO的理解,可能更进一步。所以很有必要读读设计模式。记住:每个大牛都曾是小菜!

  一、模式概述

  从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现,学习了此模式可以为后面的很多中模式打下基础。那好,我们就来了解下什么是简单工厂模式。

  简单工厂模式:何谓简单工厂模式?根据字面意思即可以理解--工厂即为绝对主角!简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

  其实想想看,小米的销售模式就有类似工厂模式:小米公司本身除了MIUI,貌似其他拥有的很少(当然钱还是有的,否则不就是骗子了嘛),可以理解本身为一个抽象工厂(没有小米,就没有M1、M2、M3嘛)。小米通过向高通公司购买骁龙处理器,购买康宁大猩猩玻璃等等,这些相当于具体产品,不论你看中的是M3还是M2(可以理解为抽象产品,毕竟只是一个代号,没有具体出来,M2也可能是一根火腿),用户下订单后(我抢啊抢啊,终于抢到啦~),小米根据预先产能的订单数量,生产产品。小米本身不参与生产。可能有人说,小米是一次的产能只能几十万台让用户订购,对于期货的营销模式,谁知道呢?

  可能例子举的不好,该模式中包含的角色及其职责主要如下:

  工厂 - Creator

    简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

  抽象产品 - Product
    简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  具体产品 - Concrete Product
    是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
  简单的UML类图如下:
    【浅读设计模式】之 简单工厂模式
 
  二、模式的实现
  设计遵从面向对象的原则进行,通过封装、继承、多态把程序的耦合度降低。
  程序预览:
              【浅读设计模式】之 简单工厂模式
 
   点击疯狂抢购吧~
      【浅读设计模式】之 简单工厂模式
  
  
  
    1、工厂类
  简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
  
 1 public class XiaoMiFactory

 2     {

 3         /// <summary>

 4         /// 根据选择,实例化对象

 5         /// </summary>

 6         /// <param name="XiaoMiType">小米型号</param>

 7         /// <returns>返回实例化的对象</returns>

 8         public static XiaoMiINFO BuyXiaoMi(string XiaoMiType)

 9         {

10             XiaoMiINFO m = null;

11             switch (XiaoMiType)

12             {

13                 case "M2S":

14                     m= new ChooseXiaoM2();

15                     break;

16                 case "M3":

17                     m = new ChooseXiaoM3();

18                     break;

19             }

20             return m;

21         }

22     }

  2、抽象产品
  它描述所有实例的公共接口。

 1 public class XiaoMiINFO

 2     {

 3         private string MI_Assembly = string.Empty;

 4         private string MI_Type = string.Empty;

 5         private string MI_Money = string.Empty;

 6 

 7         /// <summary>

 8         /// 组装...

 9         /// </summary>

10         public string m_Assembly

11         {

12             get { return MI_Assembly; }

13             set { MI_Assembly = value; }

14         }

15        /// <summary>

16        /// 小米型号

17        /// </summary>

18         public string m_Type

19         {

20             get { return MI_Type; }

21             set { MI_Type = value; }

22         }

23         /// <summary>

24         /// 小米价格

25         /// </summary>

26         public string m_Money

27         {

28             get { return MI_Money; }

29             set { MI_Money = value; }

30         }

31         /// <summary>

32         /// 组装成功,开卖

33         /// </summary>

34         /// <returns>虚方法</returns>

35         public virtual string GetReult()

36         {

37             string RetultInfo = string.Empty;

38             return RetultInfo;

39         }

40     }

  3、具体产品

  根据不同的需求,来完成具有本身特色的产品

 

 1  //继承XiaoMiINFO类,实现方法

 2     class ChooseXiaoM2 : XiaoMiINFO

 3     {

 4         public override string GetReult()

 5         {

 6             string ResultINFO =string.Empty ;

 7             ResultINFO = m_Assembly+"恭喜你,抢到M2啦\r\n"+"类型:" + m_Type + "\r\n" + "价格:" + m_Money;

 8             return ResultINFO;

 9         }  

10     }

11 

12     class ChooseXiaoM3 : XiaoMiINFO

13     {

14         public override string GetReult()

15         {

16             string ResultINFO = string.Empty ;

17             ResultINFO = m_Assembly + "恭喜你,抢到M2啦\r\n" + "类型:" + m_Type + "\r\n" + "价格:" + m_Money;

18             return ResultINFO;

19         }

20     }

  4、客户端代码

 1  public void button1_Click(object sender, EventArgs e)

 2         {

 3             XiaoMiINFO m = null;

 4             if(this.Rbtn2S.Checked)

 5             {

 6                 m = XiaoMiFactory.BuyXiaoMi("M2S");

 7                 m.m_Assembly = "生产中...\r\n"+"出厂开卖!\r\n";

 8                 m.m_Type = "M2S";

 9                 m.m_Money = "1799";

10                 string ResultINFO = m.GetReult();

11                 MessageBox.Show(ResultINFO.ToString(), "恭喜你抢到啦~", MessageBoxButtons.OK, MessageBoxIcon.Information);

12             }

13             if (this.RbtnM3.Checked)

14             {

15                 m = XiaoMiFactory.BuyXiaoMi("M3");

16                 m.m_Assembly = "买零件...\r\n" + "组装中...\r\n" + "组装成功,出厂开卖!\r\n";

17                 m.m_Type = "M3";

18                 m.m_Money = "1999";

19                 string ResultINFO = m.GetReult();

20                 MessageBox.Show(ResultINFO.ToString(), "恭喜你抢到啦~", MessageBoxButtons.OK, MessageBoxIcon.Information);

21             }

22         }  


  注:本人举例只是一人之言,并非米粉,也并非米黑,如有不对的地方,还请谅解。纵观来说,小米的出现确实改变了手机销售的模式,也导致价格的走低。说来有个很奇怪的问题,周围好多人都讨厌MI和360。比如360,但当遇到问题或者亲友电脑出现问题时,使用这个产品,又可以免去你很多的烦恼。所以具体事情具体对待吧。

  如果喜欢本篇文章,还请能给予支持,也许你的无心之举,却是我学习的动力。谢谢~

 

 

你可能感兴趣的:(简单工厂模式)