设计模式之 Abstract Factory - 抽象工厂模式

设计模式之 Abstract Factory - 抽象工厂模式

工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 

以开发项目的DAO层为例,在项目中客户的需求是常常变动的,临时更换数据库的需求也是常常发生的,那我们要如何解决跨数据库的功能,这里就要使用到抽象工厂模式了.工厂模式常常用于创建多系列化的对象(如Orale系列,MySql系列) 

1.首先定义相关接口(与平常的做法没什么区别) 

Java代码 
// 角色表DAO接口 
interface IroleDao { 
void insert(); 

void update(); 
} 
// 用户表DAO接口 
interface IuserDao { 
void find(); 

void delete(); 
}   
2.不同的数据库有不同的SQL语句所以实现时必须分数据库来实现 
Java代码 
// 用户表Oralce数据库DAO 
class OracleuserDao implements IuserDao { 
public void delete() { 
System.out.println("Oralce 删除用户表数据"); 
} 

public void find() { 
System.out.println("Oralce 查询用户表数据"); 
} 
} 

// 用户表MySql数据库DAO 
class MySqluserDao implements IuserDao { 
public void delete() { 
System.out.println("MySql 删除用户数据"); 
} 

public void find() { 
System.out.println("MySql 查询用户数据"); 
} 
} 
// 角色表Oracle数据库DAO 
class OracleroleDao implements IroleDao { 
public void insert() { 
System.out.println("Oralce 对角色表插入数据"); 
} 

public void update() { 
System.out.println("Oracle 对角色表更新数据"); 
} 
} 

// 角色表MySql数据库DAO 
class MySqlroleDAO implements IroleDao { 
public void insert() { 
System.out.println("MySql 对角色表插入数据"); 
} 

public void update() { 
System.out.println("Mysql 对角色表更新数据"); 
} 
} 

这里增加了一套DAO的实现 (与平时有所不同,如果有10个数据库就要加上10种不同的实现,比较麻烦呀) 

3.定义DAO工厂接口与实现(利用java反射机制生产出你需要的DAO如:userDAO,roleDao) 

Java代码 
// DAO工厂 
abstract class DaoFactory { 
public static DaoFactory getInstance(String classname) { 
DaoFactory dao = null; 
try { 
dao = (DaoFactory) Class.forName(classname).newInstance(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
return dao; 
} 

abstract IuserDao getuserdao(); 

abstract IroleDao getroledao(); 
} 

// Oralce工厂 
class OracleFactory extends DaoFactory { 
public IroleDao getroledao() { 
return new OracleroleDao(); 
} 
public IuserDao getuserdao() { 
return new OracleuserDao(); 
} 
} 

// MySql工厂 
class MysqlFactory extends DaoFactory { 
public IroleDao getroledao() { 
return new MySqlroleDAO(); 
} 
public IuserDao getuserdao() { 
return new MySqluserDao(); 
} 
} 

4. 定义配置文件 

Java代码 
class Config { 
// Oralce 
static final String ORALCE = "org.abc.OracleFactory"; 

static final String MYSQL = "org.abc.MysqlFactory"; 
} 

配置文件可以定义到XML中去(好处:修改配置项之后不需要对JAVA文件进行编译.) 

5.测试你的输出的DAO 
public class Dao { 
public static void main(String[] args) { 
DaoFactory.getInstance(Config.ORALCE).getroledao().insert(); 
DaoFactory.getInstance(Config.MYSQL).getroledao().insert(); 
} 

} 

总结 

使用条件:一系列接口有一系列的实现 
如上IuserDao、IroleDao等一系列的接口,他们可以有一系列的实现(Oracle方式、MySql方式) 

OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO 
组成元素(以上面例子) 
一系列接口:IuserDao、IroleDao 
一系列实现:Oracle系列、MySql系列 
系列工厂类:Oracle系列工厂类、MySql系列工厂类(必须继承抽象工厂类) 
抽象工厂类:DaoFactory

相关推荐