工厂模式把对象的创建和使用分离,这样做的好处是分离具体对象的创建和使用,达到了尽量少的代码修改。
简单工厂模式又被称之为静态工厂方法模式,它是通过一个静态方法进行对象的实例化。
下面是一个数据库的操作工厂类,里面有三种数据库的操作类,如果直接使用对象:
MySqlOperate mySqlOperate = new MySQLOperate();
当数据库改成Oracle时,客户端的代码需要修改,而如果使用工厂模式:
DataOperate dataOperate = DataOperateFactory.getInstance();
这样做客户端代码就不需要关心是Mysql,还是Oracle了,修改Oracle时,只要修改工厂类的方法就可以了,当然下面的dataType可以写到配置文件里,这样,只要修改配置文件就可以轻松切换到Oracle了。
public
class
DataOperateFactory {
public
static
final
int
ORACLE = 0; //定义三个表示数据库类型的常量
public
static
final
int
MYSQL = 1;
public
static
final
int
SQLSERVER = 2;
private
static
DataOperate db;
private
static
int
dataType = MYSQL;
/**
* 根据数据库类型(dataType)取得一个数据库操作类的实例,
* 这里对DataOperate使用了单例模式,因为OracelDataOperate等都是无状态的工具类,
* 所以整个系统只保留一个实例就行了。
*
* @return
返回的是接口,客户端不必关心具体是用那个实现类
*/
public
static
DataOperate getInstance() {
if
(db == null
) {
if
(dataType == ORACLE) //根据dateType返回相应的实现类
return
new
OracelDataOperate();
if
(dataType == MYSQL)
return
new
MysqlDataOperate();
if
(dataType == SQLSERVER)
return
new
SqlserverDataOperate();
}
return
db;
}
}
由上例可以看到,客户端代码不用改变,这个很重要,比如说你给第三方提供jar包,客户端调用代码刚开始是采用Mysql的,后来改成Oracle,显然客户端代码需要改动
又上例我们也可以看到,尽管我们的简单工厂模式解决了,客户端代码不用修改的目的,但是当增加新的产品时,工厂类必须要修改,这样扩展性就有了限制了。