抽象工厂模式下使用反射

在上一篇抽象工厂模式中介绍了标准的抽象工厂模式 但是存在一个问题就是每次新增加一条产品线是 每个创建方法中的switch语句都会在增加一条分支

非常的麻烦  本文通过反射的方式解决这一问题

该方法是在看到大话西游设计模式时学会的 再次非常感谢 为了学习特地记录在博客中


两个实体类 用户 公寓 这三者并没有什么关系 本文中的目的就是模拟操作数据库将数据插入数据库以及获取数据 

同时能灵活的拓展更换数据库的情况 和 增加表的情况 


package bin.factory.dbsample;

/**
 * Created by Administrator on 14-2-10.
 */
public class User {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


package bin.factory.dbsample;

/**
 * Created by Administrator on 14-2-10.
 */
public class Department {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


定义两个操作用户表和公寓表的DAO接口

package bin.factory.dbsample.dao;

import bin.factory.dbsample.User;


public interface IUserDao {
    public void insert(User user);

    public User getUser(int id);
}

package bin.factory.dbsample.dao;

import bin.factory.dbsample.Department;

public interface IDepartmentDao {
    public void insert(Department department);

    public Department getDepartment(int id);
}


生产DAO的工厂 在该段代码中通过一个关键字段db来确定具体使用的是哪个数据库 然后通过反射生成对应的dao 这样即使还有其他更多的数据库只需要更改对应的字段db 就可以通过反射生成

链接不同数据库的dao了   下面给出SqlServer...Dao 和 Oracle...Dao的代码

package bin.factory.dbsample.daofactory;

import bin.factory.dbsample.dao.IDepartmentDao;
import bin.factory.dbsample.dao.IPlayerDao;
import bin.factory.dbsample.dao.IUserDao;

public class DatabaseFactory {

    public String getDb() {
        return db;
    }

    public void setDb(String db) {
        this.db = db;
    }

    private String db = "Oracle";

    public IUserDao createUserDao() {
        try {
            Class clazz = Class.forName("bin.factory.dbsample.daoimpl." + db + "UserDao");
            return (IUserDao) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public IDepartmentDao createDepartmentDao() {
        try {
            Class clazz = Class.forName("bin.factory.dbsample.daoimpl." + db + "DepartmentDao");
            return (IDepartmentDao) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

package bin.factory.dbsample.daoimpl;

import bin.factory.dbsample.Department;
import bin.factory.dbsample.dao.IDepartmentDao;

public class OracleDepartmentDao implements IDepartmentDao {
    @Override
    public void insert(Department department) {
        System.out.println("oracle departmentdao insert");
    }

    @Override
    public Department getDepartment(int id) {
        System.out.println("oracle departmentdao getDepartment");
        return null;
    }
}

package bin.factory.dbsample.daoimpl;


import bin.factory.dbsample.User;
import bin.factory.dbsample.dao.IUserDao;


/**
 * Created by Administrator on 14-2-10.
 */
public class OracleUserDao implements IUserDao {
    @Override
    public void insert(User user) {
        System.out.println("oracle userdao insert");
    }


    @Override
    public User getUser(int id) {
        System.out.println("oracle userdao getuser");
        return null;
    }
}

package bin.factory.dbsample.daoimpl;


import bin.factory.dbsample.Department;
import bin.factory.dbsample.dao.IDepartmentDao;


/**
 * Created by Administrator on 14-2-10.
 */
public class SqlserverDepartmentDao implements IDepartmentDao {
    @Override
    public void insert(Department department) {
        System.out.println("SqlserverDepartmentDao insert");
    }


    @Override
    public Department getDepartment(int id) {
        System.out.println("SqlserverDepartmentDao getDepartment");
        return null;
    }
}

package bin.factory.dbsample.daoimpl;


import bin.factory.dbsample.User;
import bin.factory.dbsample.dao.IUserDao;


/**
 * Created by Administrator on 14-2-10.
 */
public class SqlserverUserDao implements IUserDao{
    public void insert(User user) {
        System.out.println("sqlserver userdao inser");
    }


    public User getUser(int id) {
        System.out.println("sqlserver userdao getUser");
        return null;
    }
}

根据以上代码只要更改string db的值即可灵活的更换数据库的具体连接操作

如果这时还要加上MySql的具体连接操作 只需要 实现 MySql...Dao类 然后在

DatabaseFactory 中令db = MySql即可 这样就可以换成MySql的具体连接操作了
这时如果要添加一个Player的表格 同时也要对应相对应的Dao操作 只需要一下几步
1 创建IPlayerDao接口

package bin.factory.dbsample.dao;

import bin.factory.dbsample.Player;

public interface IPlayerDao {
    public void insert(Player player);

    public Player getPlayer(int id);
}
2 写上具体实现类 

package bin.factory.dbsample.daoimpl;

import bin.factory.dbsample.Department;
import bin.factory.dbsample.Player;
import bin.factory.dbsample.dao.IDepartmentDao;
import bin.factory.dbsample.dao.IPlayerDao;

/**
 * Created by Administrator on 14-2-10.
 */
public class OraclePlayerDao implements IPlayerDao {

    @Override
    public void insert(Player player) {
        System.out.println("OraclePlayerDao insert");
    }

    @Override
    public Player getPlayer(int id) {
        System.out.println("OraclePlayerDao getPlayer");
        return null;
    }
}

package bin.factory.dbsample.daoimpl;

import bin.factory.dbsample.Player;
import bin.factory.dbsample.User;
import bin.factory.dbsample.dao.IPlayerDao;
import bin.factory.dbsample.dao.IUserDao;

/**
 * Created by Administrator on 14-2-10.
 */
public class SqlserverPlayerDao implements IPlayerDao{
    @Override
    public void insert(Player player) {
        System.out.println("SqlserverPlayerDao insert");
    }

    @Override
    public Player getPlayer(int id) {
        System.out.println("SqlserverPlayerDao getPlayer");
        return null;
    }
}


然后在DatabaseFactory 中多添加一个创建PlayerDao的方法 

一个可以灵活获取不同数据库操作的dao就完成了

    public IPlayerDao createPlayerDao() {
        try {
            Class clazz = Class.forName("bin.factory.dbsample.daoimpl." + db + "PlayerDao");
            return (IPlayerDao) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值