首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

抽象工场模式(java)

2012-11-08 
抽象工厂模式(java)工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用

抽象工厂模式(java)

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

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

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

// 角色表DAO接口interface IroleDao {void insert();void update();}// 用户表DAO接口interface IuserDao {void find();void delete();}

?2.不同的数据库有不同的SQL语句所以实现时必须分数据库来实现

// 用户表Oralce数据库DAOclass OracleuserDao implements IuserDao {public void delete() {System.out.println("Oralce 删除用户表数据");}public void find() {System.out.println("Oralce 查询用户表数据");}}// 用户表MySql数据库DAOclass MySqluserDao implements IuserDao {public void delete() {System.out.println("MySql 删除用户数据");}public void find() {System.out.println("MySql 查询用户数据");}}// 角色表Oracle数据库DAOclass OracleroleDao implements IroleDao {public void insert() {System.out.println("Oralce 对角色表插入数据");}public void update() {System.out.println("Oracle 对角色表更新数据");}}// 角色表MySql数据库DAOclass MySqlroleDAO implements IroleDao {public void insert() {System.out.println("MySql 对角色表插入数据");}public void update() {System.out.println("Mysql 对角色表更新数据");}}

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

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

// 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.?定义配置文件

class Config {// Oralcestatic 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

   

热点排行