【设计模式】Factory模式
假设你的软件中用到了Oracle数据库,你自己实现了一个类Oracle,于是你在程序中直接创建了一个Oracle的实例,如下,
Oracledb=newOracle();
后来你发现很多中小型客户不愿意花钱购买Oracle,于是你考虑用XML甚至文件来替换Oracle。于是你不得不修改你的应用程序并重新编译。
XMLDB db=newXMLDB();
or
FlatFileDB db=newFlatFileDB();
这时你的软件中可以支持三种类型的数据库:FlatFile,XML与Oracle。可以考虑为这三种数据库创建统一的接口Database,如下图所示:
于是再次修改代码如下:
Databasedb=newOracle();
or
Databasedb=newXMLDB();
or
Database db=newFlatFileDB();
由于你的软件对数据库的操作都是通过接口Database进行的,并且决不会调用特定于任何数据库(FlatFileDB,XMLDB或Oracle)的方法,那么你的软件就不应该依赖于具体的数据库类。为了彻底摆脱对具体数据库类的依赖,可以采用Factory模式,通过Factory实例来创建具体数据库的实例,而不是在客户程序中直接new了。如下图所示:
DatabaseFactoryImpl的代码如下:
publicclassDatabaseFactoryImplimplementsDatabaseFactory
{
publicDatabasecreate(StringdatabaseType)throwsException
{
if(databaseType.equals("FlatFileDB"))
returnnewFlatFileDB();
elseif(databaseType.equals("XMLDB"))
returnnewXMLDB();
elseif(databaseType.equals("Oracle"))
returnnewOracle();
else
thrownewException("Unsupported databaseType "+databaseType);
}
}
你可以将对数据库的选择放在配置文件中,以后可以自如的在这三种数据库中动态切换,而不用重新编译应用程序。
其实Factory模式也体现了以前讲过的依赖倒置原则(DIP),应用程序应该依赖于抽象,而不是具体类。应用Factory模式,应用程序只依赖于抽象的接口就能创造出具体的对象实例。
Factory模式在单元测试中也大有用途。在上面例子中,在开发过程中,通常希望在不使用数据库的情况下单独测试Application,这时就可以实现一个MockDatabaseFactory以及相应的MockDatabase。具体就不多说了。
Factory模式是一个很有效的模式,但是使用Factory模式也会带来复杂性,至少增加了额外的几个类,所以不应该盲目使用此模式,无论创建任何对象都使用Factory模式的想法未免过于极端了。
- 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 数组属性和方法
- 元素滚动 scroll 系列
- Java基础系列之fastjson parse多级json数据
- Linux系列之下载安装jdk-8u261-linux-i586.tar.gz
- 常见网页特效案例
- MySQL系列之体系结构原理学习笔记
- 触屏事件
- 10.2【前端开发】图片文件格式:常见的图片格式对比有何优劣以及如何使用Google的webp格式?
- uni-app 与 Vue H5 项目通讯
- Gridview][UpdateCommand的写法要点]
- MySQL系列之事务日志Undo log学习笔记
- click 延时解决方案
- Splash抓取javaScript动态渲染页面
- Sentence-Transformer的使用及fine-tune教程
- MySQL系列之事务日志Redo log学习笔记
- jQuery 的基本使用