java设计模式之——简单工厂

简单介绍

我们在写的程序,难免遇到需要新增功能的时候,但是新增功能,不能在原本的代码上进行修改,因为在原本的代码上修改,因为修改已经完备的代码可能会导致以前正常的功能变得不可用。

最好的办法是:在新增的功能就重写写代码,原本的代码不懂,然后将新实现的功能与原本的代码进行合并,使新功能可用,而又不修过原本的代码。这就是我们经常说的,对扩展开放,对修改关闭。如果此时用简单工厂模式,就可以很好的解决这个问题。

例子

例如,我们要实现一个计算器,我的第一想法可能就是写在一个方法里,搜集输入数据、运算逻辑、展示输出(很简单的代码,我就不贴代码了)。这样做虽然很容易就做出来了,并且也能实现功能。但是这样做耦合非常严重,而且核心的计算逻辑不能复用。

但是如果考虑用面向对象的思想,并且使用简单工厂模式,那么整个程序的结构会非常清楚,而且可以做到复用。思路是这样的:计算我们不直接写实现逻辑,而是定义一个类,比如加法就定义一个加法类,减法就定义一个减法类。运算工厂就可以根据传入的符号而构建出对应的运算类。我的写的一个小Demo类如下如下:
demo类

Calculate接口

首先介绍Calculate接口,这是一个计算接口,里面定义了一个计算方法,传入两个操作数,返回一个结果。每个
计算接口
每个运算类都应该继承这个接口,这样做的目的是为了统一,我们在用工厂构建运算类时,不能返回某个具体的加法类或是减法类,只能是一个大的、抽象的、能够代表所有计算类的,最好的选择就是运算接口。这里涉及到了面向对象中的多态,不理解的小伙伴可以先好好理解多态。

Add、Sub运算类

Add、Sub都是运算类,顾名思义,Add是用于做加法的,Sub是用于做减法的,它们都实现了Calculate接口,实现了其中的计算方法calculate,根据自身的运算逻辑做不同的实现。

Add类
Add类
Sub类
Sub类

CalculateFactory 运算工厂

我觉得这里的命名不太准确,因为这这是运算类的工厂,并不是运算的工厂,就这样吧。这个类是用于构建具体运算类,返回值是一个运算类,具体的类是什么就要根据传入的运算符而定了(基于接口的多态)。
CalculateFactory类
这里就是工厂的逻辑,如果我们要扩展,就需要在这里做修改。

使用

如果是刚接触的同学,看到这里可能有点懵了,这要怎么调用呢?
测试类
具体用法就是11行所示,也可以拆成14、15两行。先是通过运算类工厂根据传入的运算符创建对应的运算类,然后再调用运算类的运算方法calculate方法即可。

好处

这样做,比起来写在一个方法中,好像麻烦了很多,但有这些好处:

  1. 我们如果需要新增一个除法类,那么我们只需要新增一个除法类,实现Calculate接口,然后在工厂类中多添一个switch分支即可,不会对原有的逻辑产生影响。
  2. 代码可以复用,如果我们这个计算器要做成web的或者Windows的或者其他形式的,那么只是收集输入和展示结果不同,核心的运算逻辑都是可以复用。

JDK中的Calendar就用到了工厂模式。

结束语

这篇博客参考了程杰的《大话设计模式》,并且结合了韩顺平老师的《图解java设计模式》。有什么不懂或者不对的地方,欢迎留言讨论交流。

另外,对于刚接触设计模式的同学来说,《大话设计模式》非常推荐,通俗易懂,不会枯燥无味。虽然使用的java版本有点老了,将jdk1.8作为java启蒙版本的我对书中的有些代码看着很不习惯,但是并不影响我理解设计模式的思想。

我这里有pdf版的资源,有需要的小伙伴可以找我。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值