抽象工厂模式

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

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

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数据库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();  
    }  


// 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.测试你的输出的DAO

Java代码
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值