C#实现简单工厂模式

设计模式 专栏收录该内容
12 篇文章 0 订阅

(文章地址:http://mp.weixin.qq.com/s/kkilLvrr7h3qgqiwVtzPfw) 末尾有工程文件

设计模式虽然对性能来说不会有很大的提升,但是许多设计模式在开发的过程中还是非常有用的,运用好设计模式,可以帮助提升开发效率,加快开发速度 。 今天分享的是:简单工厂模式

    软件开发中策划一般有这样一个需求:需要开发一个简单的计算器,实现加、减、乘、除的数学运算,首先按照我们正常的开发逻辑和快速开发需求来设计,我们会这样实现:


好了,具体的功能都实现了,策划的需求也满足了,但是你以为这样就结束了吗?甲方的新需求来了:由于我们业务的原因,我们现在公司做大了,以前用加减乘除就能算完的财务,现在需要用幂次方才能解决了。好吧,emmmm,你可能会想,嗯,这个还不简单吗?我直接在Switch语句中在添加一个Case分支,再把对应的运算逻辑也写进去不就完了?


然后在修改对应的提示部分。对的,这样的做法没有错,实现了具体的功能。但是我们思考一下,如果甲方的业务拓展到了全国,他觉得平方的计算也满足不了他财务计算的需求了,但是他还需要保留原有一些加减乘除的计算需求,这个时候我们可能会想,那还不简单吗,我再加一个case语句,再把 计算过程在case里实现以下,对应的运算符提示部分也添加以下。嗯,就是这样。好了,甲方需求又来了,这次他们的业务扩展到了全球,需要的计算量不是简单的加减乘除能够满足的了。回过头看程序,可能会发现,每次甲方该需求,我们都要去Switch语句中添加一个case分支,然后再实现具体的计算过程,再到选择运算符提示部分更改相应的提示。当甲方的需求越来越多,越来与复杂,会发现,swicth语句变得非常庞大,一个case分支可能就占据了数十数百行,阅读起来十分困难,并且,在case分支下局限非常多,许多功能实现起来非常繁琐。这个时候,我们就可以考虑使用简单工厂模式来解决这个问题了。

    首先,我们把问题提取出来分析,在这个计算器的实现过程中,我们把功能抽象化,1.需要读取用户的输入  2.对用户的输入进行不同的计算 3.输出计算的结果。就这么简单的三个步骤。从上面的代码中可以看出,计算的过程有很大的相同处和不同之处,比如:都需要传入两个值,都有一个运算符,都需要输出一个结果。只是选择的运算符不同,而且加减乘除之间的运算过程相互之间没有任何的联系和影响。我加法负责把两个数相加,做减法时,我只负责把两个数相减就可以了,你其它运算符做什么关我什么事啊,我为什么要和你们这些一直增长的家伙放在一起啊,没有你们,我一样也能减的开心,我只需要把我减的结果告诉网管就可以了,下次要做减法的时候,让网管给我两个数,我还他一个beautiful。从中可以看出,做运算的时候,只需要有两个数,返回一个结果就行,你TM管我是加法还是减法。那么,我们是不是可以把运算过程独立出来呢?找找看,所有运算过程公有的部分,把公有部分提取出来,做成一个基类:



加法运算:


减法运算:


平方运算:


好了,到这里具体的运算过程都已经被单独的提取出来了,下面实现一下这个简单的工厂类:


最后实现一下调用的过程:


这就是简单工厂的大概实现方式,其实现过程还有许多可以优化的地方,比如,不使用switch语句来判断传入的运算发是什么,实际开发过程中使用响应式编程或者是触发式编程来处理运算符的传入,总之,具体的问题具体看吧。下次甲方需要加需求,我们只需要添加相对应的计算类就可以了,可以试着把switch语句去除,这样使得程序更加简洁。

  • 1
    点赞
  • 1
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值