设计模式入门-简单工厂模式
前言
话说设计模式是我们面试中经常遇到的问题,但是开发中遇到的也不少。之前一直想学设计模式,然后总结写一些文章,但一直忙于其它事情,现在终于要学习设计模式,参考的书籍是《大话设计模式》,这本书写得通俗易懂,推荐大家都去看一下。
场景描述
借用书中示例问题,计算两个数的加、减、乘、除等其它运算,一般我们的思维是自上而下处理问题,也就造成了运算两个数就要经过多次判断。
场景示例
两个数之前的算法运算,如下面代码所示:
package me.xueyao; /** * @author Simon.Xue * @date 2019-12-30 22:54 **/ public class OperationHello { public static void main(String[] args) { System.out.println(getResult("*", 1, 3)); } public static int getResult(String operationStr, int number1, int number2) { int result = 0; switch (operationStr) { case "+": result = number1 + number2; break; case "-": result = number1 - number2; break; case "*": result = number1 * number2; break; case "/": result = number1 / number2; break; } return result; } }
此处的代码要判断四次,但是如果再增加其它的运算,会在原来基础上又增加条件判断。以后,随着业务有扩展会不停添加判断条件。代码的耦合度会越来越高,如果修改某一处运算的问题,就造成线上业务不能访问相关运算的功能,必须要修改好问题,其它的运算功能才能使用。
解决办法
现在可以用到我们所说的简单工厂模式,首先,我们要想,加、减、乘、除运算都属于运算子类,所以我们创建一个运算父类Operation .class
package me.xueyao; /** * @author Simon.Xue * @date 2019-12-30 22:18 **/ public abstract class Operation { private int number1; private int number2; public int getNumber1() { return number1; } public void setNumber1(int number1) { this.number1 = number1; } public int getNumber2() { return number2; } public void setNumber2(int number2) { this.number2 = number2; } public abstract int getResult(); }
加、减、乘、除四则运算,我们分别创建OperationAdd.class,OperationSub.class,OperationMul.class,OperationDiv.class四个子类分别继承运算父类Operation.class, 实现其中计算方法。
package me.xueyao; /** * @author Simon.Xue * @date 2019-12-30 22:22 **/ public class OperationAdd extends Operation { @Override public int getResult() { return getNumber1() + getNumber2(); } }
package me.xueyao; /** * @author Simon.Xue * @date 2019-12-30 22:22 **/ public class OperationSub extends Operation { @Override public int getResult() { return getNumber1() - getNumber2(); } }
package me.xueyao; /** * @author Simon.Xue * @date 2019-12-30 22:25 **/ public class OperationMul extends Operation { @Override public int getResult() { return getNumber1() * getNumber2(); } }
package me.xueyao; /** * @author Simon.Xue * @date 2019-12-30 22:26 **/ public class OperationDiv extends Operation { @Override public int getResult() { return getNumber1() / getNumber2(); } }
当我们要使用运算方法时,只需要创建其对象,再执行计算方法,便可计算两个数的运算,但是现在又有一个问题,就是每种运算方式都要创建对象。都要暴露父类对象,我们可以创建一个工厂类,由工厂类来创建所需要的对象,如下代码如示
package me.xueyao; /** * @author Simon.Xue * @date 2019-12-30 22:30 **/ public class OperationFactory { public static Operation createOperation(String operationStr) { Operation operation = null; switch (operationStr) { case "+": operation = new OperationAdd(); break; case "-": operation = new OperationSub(); break; case "*": operation = new OperationMul(); break; case "/": operation = new OperationDiv(); break; } return operation; } }
总结
简单工厂模式,是设计模式中比较简单的一种模式,但是它每多出一种需求,就要创建一个类,总体来说用起来还不错。文章如有问题,请联系我。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用wxpy这个基于python实现的微信工具库的一些常见问题
使用如下的命令行安装: pip install wxpy Collecting wxpy Downloading https://files.pythonhosted.org/packages/6b/ac/8fc4561551489f36/wxpy-0.3.9.8.tar.gz (45kB) 100% | 51kB 98kB/s Collecting itchat==1.2.32 (from wxpy) Downloading https://files.pythonhosted.org/packages/61/6d/493fec62ed7bb343/itchat-1.2.32-py2.py3-none-any.whl Requirement already satisfied: requests in c:myapppy20180816Requirement already satisfied: future in c:myapppy20180816lom wxpy) (0.16.0) Collecting pyqrcode (from itchat==1.2.32->wxpy...
- 下一篇
2020年去一线大厂面试先过SSM框架源码这一关!
SSM框架介绍 (1)持久层(Mybatis):Dao层(mapper)DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。DAO层的设计首先是设计DAO的接口。然后在Spring的配置文件中定义此接口的实现类。然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰。DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。(2)业务层(Spring):Service层Service层:Service层主要负责业务模块的逻辑应用设计。首先设计接口,再设计其实现的类。接着再在Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的DAO层的接口。封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。(3)表现层(springMVC):Controller层(Handler层)Controller层:Controller层负责具体的业务模块流程的控制。在此...
相关文章
文章评论
共有0条评论来说两句吧...