三分钟理解“工厂模式”——设计模式轻松掌握

举个例子

假设需要我们写一个简单的计算器,能实现加减乘除运算,仅要求输入两个数,选择运算符,计算出结果就行了。

使用简单工厂模式的设计如下:

工厂类提供了一个getBean函数,该函数会根据客户端输入的key来判断究竟new运算类的哪一个子类对象。

简单工厂模式的弊端:

当需要增加计算器的功能时,比如要增加一个开根号的功能,那么首先需要创建一个开根号子类,继承运算类,并实现operation函数;

除此之外,还需要修改工厂类,在getBean函数中增加对开根号的判断。

也就是说,简单工厂模式在增加功能时,需要修改工厂中的getBean函数,破坏了“封闭修改”的原则。而工厂模式能解决这个问题。

用工厂模式来实现:

由于在简单工厂模式中,增加功能时需要修改工厂类的代码,这时候我们应该敏锐地察觉到:我们破坏了“封闭修改”地原则,说明我们修改的那个类是面向实现编程,因此我们要给修改的工厂类抽象出一个父类/接口,从而达到面向接口编程,这就是“依赖倒转”的思想。

当我们使用了工厂模式之后,如果需要增加开根号运算的话,在增加开根号运算类的基础上,我们还需要增加开根号工厂类,让它去继承工厂父类,覆盖里面的getBean函数,在该函数中只创建开根号类的对象。

此时我们发现,再怎么增加功能,工厂类和运算类都没有作任何修改,都只是增加新类而已。这就满足了“开放扩展,封闭修改”的原则。

工厂模式的弊端:

工厂模式使得低层类实现了“开放-封闭”的原则,但在客户端,究竟使用哪个工厂子类获取运算类的对象,这件事情就要在客户程序中判断了。也就是把简单工厂模式中的判断,转移到了客户端。

mian(){

Factory factory;

switch (key){

case "+":

factory = new 加法Factory();

break;

case "-":

factory = new 减法Factory();

break;

case "*":

factory = new 乘法Factory();

break;

case "/":

factory = new 除法Factory();

break;

}

运算类 运算对象 = new factory.getBean();

}

工厂模式和简单工厂模式的比较:

简单工厂模式把创建哪个运算类的对象放在工厂类中实现,也就是放在低层模块中实现;从而客户端在需要创建对象时仅仅需要给工厂传入一个key就能获取想要的对象。但当运算体系需要扩展的时候,就需要在工厂中增加新对象的判断,从而破坏了“封闭修改”的原则。

工厂模式由于抽象出了一个工厂父类,并且每一运算子类都有一个专门创建该子类对象的工厂子类,因此在增加运算子类的时候,工厂类不需要修改任何代码,只需要增加一个工厂子类即可。但客户端就需要给判断究竟给工厂父类创建哪个工厂子类对象。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我就是马云飞

设计模式二十四章经之单例设计模式

1003
来自专栏分享达人秀

Activity间数据传递方法汇总

在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递。 一、常用数据...

3466
来自专栏步履前行

什么是面向对象

面向对象的特征有3个,封装、继承、多态。至于抽象的话,个人认为,应该是前面3大特征中都有抽象的思想,毕竟面向对象本身就是一种抽象。 比如 子类 extends ...

3356
来自专栏别先生

Java的从浅至深绕坑而行的学习

1 package day02; 2 /** 3 * 1:java初学习,避免面试时一些HR挖的坑。 4 * @author biexianshen...

19310
来自专栏yl 成长笔记

设计模式 (3) : 单例模式的几种方法

原理: c# 中用 new 方法创建一个实例需要调用类的构造函数(注: 每一个类都必须有至少一个构造函数, 当我们未定义构造函数时,编译时编译器会帮我们生成一个...

392
来自专栏编码小白

tomcat源码解读三(2) tomcat中JMX的源码分析

     在这里我是将tomcat中的jmx给拆分出来进行单独分析,希望通过此种方式能够尽可能的出现更多的问题,以便对其有更多的了解,首先需要声明的是tomca...

4105
来自专栏企鹅号快讯

优秀的持久层框架-Mybatis框架解析

Topic Mybatis步骤 mybatis解决原生态jdbc的问题 数据库连接,使用时连接,不使用时释放,对数据库进行频繁连接的开启和关闭,造成数据库资源浪...

1829
来自专栏JAVA高级架构

我们为什么要使用 AOP

前言 一年半前写了一篇文章Spring3:AOP,是当时学习如何使用Spring AOP的时候写的,比较基础。这篇文章最后的推荐以及回复认为我写的对大家有帮助的...

3177
来自专栏Zephery

2017-03-02学习笔记

知识点 一、static public class Spike { public static void main(String[] args) ...

36110
来自专栏LinkedBear的个人空间

唠唠SE的面向对象-09——interface接口

Java是单继承机制,那么一个类需要有多个操作并且来自不同类的时候,就需要接口来弥补这种缺点。

521

扫描关注云+社区