读书人

工场方法与抽象工厂详解

发布时间: 2012-06-29 15:48:46 作者: rapoo

工厂方法与抽象工厂详解
下面是一个典型的工厂方法模式:

1.首先定义相关接口(与平常的做法没什么区别)Java代码 // 角色表DAO接口   interface IroleDao {       void insert();         void update();   }   // 用户表DAO接口   interface IuserDao {       void find();         void delete();   }  // 角色表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 对角色表更新数据");       }   }  // 用户表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种不同的实现,比较麻烦呀)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();       }   }  // 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";   }  class Config { // Oralce static final String ORALCE = "org.abc.OracleFactory"; static final String MYSQL = "org.abc.MysqlFactory";}  配置文件可以定义到XML中去(好处:修改配置项之后不需要对JAVA文件进行编译.)5.测试你的输出的DAOJava代码 public class Dao {       public static void main(String[] args) {           DaoFactory.getInstance(Config.ORALCE).getroledao().insert();           DaoFactory.getInstance(Config.MYSQL).getroledao().insert();       }     }  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



读书人网 >行业软件

热点推荐