为什么用简单工厂模式,而不是直接实例化对象
时间:2019-03-13
本文章向大家介绍为什么用简单工厂模式,而不是直接实例化对象,主要包括为什么用简单工厂模式,而不是直接实例化对象使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一开始了解了"简单工厂模式"之后,在关于为什么不直接实例对象,而是利用工厂类来实例对象产生了疑惑。
经过多种渠道的了解,我最后的观点是:这个工厂类不仅仅就只能有实例化对象这一个功能。举例来说,如果我要在实例化这个对象之前先读取某些配置,做各种各样的预备工作呢?比如下面的代码:
客户端类:
public class ConsoleUser { public static void main(String[] args) { //新建运算类 Operation operation; //各种乱七八糟的操作 System.out.println("新建对象a"); System.out.println("新建对象b"); System.out.println("读取配置1"); System.out.println("给对象a赋值"); System.out.println("读取配置2"); System.out.println("给对象b赋值"); //创建加法类实例对象,并赋值给运算类 operation = new OperationPlus(); operation.num1 = 5; operation.num2 = 2; //打印返回的计算结果 System.out.println(operation.getResult()); } }
这就是你们说的,不用工厂,而是直接创建对象。假如要多次调用,那岂不是还要把这些繁琐的操作再做一遍?
如果把这些复杂繁琐的操作,提取到工厂的方法中,就会让编码得到很大的简化。
工厂类:
public class OperationFactory { public static Operation createOperation(char operate) { Operation operation = null; switch (operate) { case '+': System.out.println("新建对象a"); System.out.println("新建对象b"); System.out.println("读取配置1"); System.out.println("给对象a赋值"); System.out.println("读取配置2"); System.out.println("给对象b赋值"); operation = new OperationPlus(); break; case '-': operation = new OperationSub(); break; case '/': operation = new OperationDiv(); break; case '*': operation = new OperationMul(); break; } return operation; } }
客户端类(使用简单工厂方法):
public class ConsoleUser { public static void main(String[] args) { //新建运算类 Operation operation; //工厂新建加法运算对象 operation = OperationFactory.createOperation('+'); operation.num1 = 5; operation.num2 = 2; //对象调用方法返回信息 System.out.println(operation.getResult()); } }
为了验证我的说法,特地去SessionFactoryImpl这个实现类中找到了opensession这个方法,代码如下:
SessionFactoryImpl中的源码:
private SessionImpl openSession( Connection connection, boolean autoClose, long timestamp, Interceptor sessionLocalInterceptor ) { return new SessionImpl( connection, this, autoClose, timestamp, sessionLocalInterceptor == null ? interceptor : sessionLocalInterceptor, settings.getDefaultEntityMode(), settings.isFlushBeforeCompletionEnabled(), settings.isAutoCloseSessionEnabled(), settings.getConnectionReleaseMode() ); }
可能有些人会想,为啥不把这些复杂的操作放在加法运算类中。但是这样做,就违背了你一开始想要把具体的运算方法独立出来的初衷,代码耦合了。
比如我有个功能,就只需要加法这个对象而已,那不就尴尬了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 动态加载二维码视图生成快照的示例
- 使用Mybatis反配置逆向工程,错误eg:This is not a MyBatis Generator Configu
- DTS(数据库传输服务)
- R语言关联挖掘实例(购物篮分析)
- 用R语言中的神经网络预测时间序列:多层感知器和极限学习机
- 基于R语言股票市场收益的统计可视化分析
- Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load
- 如何从xml文件创建R语言数据框dataframe
- Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV) 模型
- 如何从xml文件创建R语言数据框dataframe
- R语言POT超阈值模型和极值理论EVT分析
- R语言使用灰色关联分析(Grey Relation Analysis,GRA)中国经济社会发展指标
- R语言中的模拟过程和离散化:泊松过程和维纳过程
- R语言Lee-Carter模型对年死亡率建模预测预期寿命
- R语言有极值(EVT)依赖结构的马尔可夫链(MC)对洪水极值分析