在上一篇抽象工厂模式中介绍了标准的抽象工厂模式 但是存在一个问题就是每次新增加一条产品线是 每个创建方法中的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;
}
}
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;
}
}
一个可以灵活获取不同数据库操作的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;
}