博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单工厂模式
阅读量:6266 次
发布时间:2019-06-22

本文共 1569 字,大约阅读时间需要 5 分钟。

hot3.png

一、写在前面

实习以来越发发现自己写的代码并不能很好的维护和扩展。总是显得乱七八糟的。利用每天上班搭公交的时间,看了下设计模式。发现设计模式真的好多。笼统的看了一遍,发现完全无法体会。所以只好又从简单的工厂模式开始看。下面用具体的而简单的例子来想大家说明简单工厂模式是什么样子

二、儿子吃饭的故事(自己脑补的故事,莫喷)

故事是这样的,有一户人家,住着幸福的三口之家,爸爸,妈妈,和儿子。儿子只有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

转载于:https://my.oschina.net/RabbitXiao/blog/648783

你可能感兴趣的文章
MVC总结--MVC简单介绍以及和WebForm差别
查看>>
tiny4412 裸机程序 五、控制icache【转】
查看>>
VB.NET多线程入门
查看>>
国外物联网平台初探(二) ——微软Azure IoT
查看>>
findlibrary returned null产生的联想,Android ndk开发打包时我们应该怎样注意平台的兼容(x86,arm,arm-v7a)...
查看>>
Android事件分发机制源代码分析
查看>>
《设计模式》结构型模式
查看>>
[javase学习笔记]-8.3 statickeyword使用的注意细节
查看>>
Spring集成RabbitMQ-使用RabbitMQ更方便
查看>>
Nginx 设置域名转向配置
查看>>
.net core 实现简单爬虫—抓取博客园的博文列表
查看>>
FP-Tree算法的实现
查看>>
Android 用Handler和Message实现计时效果及其中一些疑问
查看>>
Dos命令删除添加新服务
查看>>
C#.NET常见问题(FAQ)-索引器indexer有什么用
查看>>
hadoop YARN配置参数剖析—MapReduce相关参数
查看>>
Java 正则表达式详细使用
查看>>
【ADO.NET】SqlBulkCopy批量添加DataTable
查看>>
SqlServer--bat批处理执行sql语句1-osql
查看>>
Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令
查看>>