吐槽:上班工作为生活,下班读书是爱好!技术需要的是经验,而不是凭借工作年限来证明些什么。
最近在看程杰著作的《大话设计模式》,全书以小菜和大鸟对话的形势,由浅入深的讲解程序的设计思想,影射出一个个设计模式。感慨作者妙笔生花的同时,也思量自己的不足。我们中的很多程序猿,做的是二次开发的事情。因为一般公司都是有一个成熟的产品,或者公司不会冒险让你做一个全新的项目。这些设计模式也不一定能用得上,但这些设计模式让自己对OO的理解,可能更进一步。所以很有必要读读设计模式。记住:每个大牛都曾是小菜!
一、模式概述
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现,学习了此模式可以为后面的很多中模式打下基础。那好,我们就来了解下什么是简单工厂模式。
简单工厂模式:何谓简单工厂模式?根据字面意思即可以理解--工厂即为绝对主角!简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
其实想想看,小米的销售模式就有类似工厂模式:小米公司本身除了MIUI,貌似其他拥有的很少(当然钱还是有的,否则不就是骗子了嘛),可以理解本身为一个抽象工厂(没有小米,就没有M1、M2、M3嘛)。小米通过向高通公司购买骁龙处理器,购买康宁大猩猩玻璃等等,这些相当于具体产品,不论你看中的是M3还是M2(可以理解为抽象产品,毕竟只是一个代号,没有具体出来,M2也可能是一根火腿),用户下订单后(我抢啊抢啊,终于抢到啦~),小米根据预先产能的订单数量,生产产品。小米本身不参与生产。可能有人说,小米是一次的产能只能几十万台让用户订购,对于期货的营销模式,谁知道呢?
可能例子举的不好,该模式中包含的角色及其职责主要如下:
工厂 - Creator
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
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,但当遇到问题或者亲友电脑出现问题时,使用这个产品,又可以免去你很多的烦恼。所以具体事情具体对待吧。
如果喜欢本篇文章,还请能给予支持,也许你的无心之举,却是我学习的动力。谢谢~