一、写在前面
实习以来越发发现自己写的代码并不能很好的维护和扩展。总是显得乱七八糟的。利用每天上班搭公交的时间,看了下设计模式。发现设计模式真的好多。笼统的看了一遍,发现完全无法体会。所以只好又从简单的工厂模式开始看。下面用具体的而简单的例子来想大家说明简单工厂模式是什么样子。
二、儿子吃饭的故事(自己脑补的故事,莫喷)
故事是这样的,有一户人家,住着幸福的三口之家,爸爸,妈妈,和儿子。儿子只有6岁,生活还不能自理。每次吃饭,都会找他妈妈,他会说,妈妈,我今天要吃土豆!妈妈,摸摸儿子的头,笑着说:行!妈妈给你做!。
三、问题来了
请问你改怎么实现这么一个过程呢?如果你没有面向接口编程的概念,不知道设计模式的话,也许你会这样写程序。想到什么写说明。
完全不遵守设计上的开闭原则(对扩展开放,对已有的功能闭合)
代码如下:
//土豆class tudou{ public string cook() { console.write("土豆做好啦,可以吃了!"); }}//茄子class qiezi{ public string cook() { console.write("茄子做好啦,可以吃了!"); }}//儿子class son{tudou td=new tudou();td.cook();}
我相信,没有接口意识的人,一定会这么写。妈妈这个做菜的人,在这里并没有起到作用。很显然,以上儿子能吃到东西,得自己来。这样并不符合,开闭原则。实际上,我们需要通过妈妈这个工厂,来给儿子提供事物。而不是自己直接就new了一个食品出来。这叫做,儿子是消费者,而不是生产者。这个生成者得由妈妈来当。
使用简单工厂模式后的代码如下:
//土豆(担任具体产品角色)class tudou{ public string cook() { console.write("土豆做好啦,可以吃了!"); }}//茄子(担任具体产品的角色)class qiezi{ public string cook() { console.write("茄子做好啦,可以吃了!"); }}//食物接口(担任抽象产品的角色)interface Food{ string Cook();}//MUM (担任食品工厂,负责出食品)Class Mum{public Food GetFood(string foodname) {if(foodname=="tudou"return new tudou();if(foodname=="qiezi")return new qiezi(); }}//son(消费食物,担任消费者)class son{void main(){Food fd=(new Mum()).GetFood("tudou");//要妈妈去给我拿食物。fd.cook();}}
四.总结
我们可以通过开闭原则来分析一下,如果说,儿子突然想吃炖排骨了。那么,我们只需要将排骨继承Food接口即可。这叫对扩展开发。那么对内是否闭合呢,是否就不用修改以前的代码了呢?当然不是啦。如果有增加了一个食物。势必在Mum那就得增加一个if逻辑了。所以对于mum类,就得做逻辑修改了。说的易懂点,就是妈妈得记住所有菜谱。
所以呢,简单工厂模式,只适合,产品不多的情况下。如果产品多的话,为了防止写过于繁琐的if else语句。也为了闭合原则,我们就得使用抽象工厂模式了!它足以应付大部分业务设计。当新增产品的时候,我们不需要修改以前任何的代码。这一块内容再下一篇文章里面,我会分享到。敬请期待。。。。
欢迎交流学习。qq:739462304@qq.com