使用Java反射跟简单工厂模式改进抽象工厂模式
2017-03-01 09:52
288 查看
结合Java的反射机制,可以用简单工厂模式来改进抽象工厂模式,减少类的数量,增加可维护性。UML图如下:
去除IFactory、SqlserverFactory和AccessFactory三个工厂类,取而代之的是DataAccess类,用一个简单工厂模式来实现。
代码示例:
1. 两个表User和Department的实体类
[java] view
plain copy
public class User {
private int id;
private String userName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public User(int id, String userName) {
super();
this.id = id;
this.userName = userName;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + "]";
}
}
[java] view
plain copy
public class Department {
private int id;
private String deptName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Department() {
super();
// TODO Auto-generated constructor stub
}
public Department(int id, String deptName) {
super();
this.id = id;
this.deptName = deptName;
}
@Override
public String toString() {
return "Department [deptName=" + deptName + ", id=" + id + "]";
}
}
2. 两个表操作的接口
[java] view
plain copy
public interface IUserDao {
abstract void insert(User user);
abstract User select(int id);
}
[java] view
plain copy
public interface IDepartmentDao {
abstract void insert(Department dept);
abstract Department select(int id);
}
3. IUserDao的MySQL实现和Oracle实现
[java] view
plain copy
public class UserMysqlImpl implements IUserDao {
@Override
public void insert(User user) {
// TODO Auto-generated method stub
System.out.println("User: MySQL实现插入一条记录:"+user.toString());
}
@Override
public User select(int id) {
// TODO Auto-generated method stub
System.out.println("User: MySQL实现查询 :id = "+id);
return null;
}
}
[java] view
plain copy
public class UserOracleImpl implements IUserDao {
@Override
public void insert(User user) {
// TODO Auto-generated method stub
System.out.println("User: Oracle实现插入一条记录:"+user.toString());
}
@Override
public User select(int id) {
// TODO Auto-generated method stub
System.out.println("User: Oracle实现查询 :id = "+id);
return null;
}
}
4. IDepartmentDao的Mysql实现和oracle实现
[java] view
plain copy
public class DepartmentMySqlImpl implements IDepartmentDao {
@Override
public void insert(Department dept) {
// TODO Auto-generated method stub
System.out.println("Department: MySQL实现插入一条记录." + dept.toString());
}
@Override
public Department select(int id) {
// TODO Auto-generated method stub
System.out.println("Department: MySQL查询记录 id = " + id);
return null;
}
}
[java] view
plain copy
public class DepartmentOracleImpl implements IDepartmentDao{
@Override
public void insert(Department dept) {
// TODO Auto-generated method stub
System.out.println("Department: Oracle实现插入一条记录." + dept.toString());
}
@Override
public Department select(int id) {
// TODO Auto-generated method stub
System.out.println("Department: Oracle实现查询一条记录 id = " + id);
return null;
}
}
5.DataAccess类
[java] view
plain copy
public class DataAccess {
private String db;
public IUserDao createUserDao()
throws ClassNotFoundException,
InstantiationException,
IllegalAccessException{
if(db != null && !db.equals("")){
//拼接字符串,注意类名包含包名
String className = "com.design.abstractFactory.product.User" + db +"Impl";
//获取以className字符串为名的类
Class<IUserDao> userDaoImplClass
= (Class<IUserDao>) Class.forName(className);
//返回类的实例
return userDaoImplClass.newInstance();
}
return null;
}
public IDepartmentDao createDepatDao()
throws ClassNotFoundException,
InstantiationException,
IllegalAccessException{
if(db != null && !db.equals("")){
//拼接字符串,注意类名包括包名
String className = "com.design.abstractFactory.product.Department" + db +"Impl";
//获取以className字符串为名的类
Class<IDepartmentDao> deptDaoImplClass
= (Class<IDepartmentDao>) Class.forName(className);
//返回类的实例
return deptDaoImplClass.newInstance();
}
return null;
}
public String getDb() {
return db;
}
public void setDb(String db) {
this.db = db;
}
}
6. client端
[java] view
plain copy
public class abstractFactoryTest {
@Test
public void testDataAccess() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{
Properties proper = new Properties();
InputStream is
= this.getClass().getClassLoader().getResourceAsStream("DB.properties");
proper.load(is);
String db = proper.getProperty("db");
DataAccess dataAcc = new DataAccess();
dataAcc.setDb(db);
IUserDao userDao = dataAcc.createUserDao();
IDepartmentDao deptDao = dataAcc.createDepatDao();
User user = new User(1, "pathfiner");
Department dept = new Department(1, "aaa");
userDao.insert(user);
deptDao.select(1);
}
}
DB.properties
[java] view
plain copy
db=MySql
去除IFactory、SqlserverFactory和AccessFactory三个工厂类,取而代之的是DataAccess类,用一个简单工厂模式来实现。
代码示例:
1. 两个表User和Department的实体类
[java] view
plain copy
public class User {
private int id;
private String userName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public User(int id, String userName) {
super();
this.id = id;
this.userName = userName;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + "]";
}
}
[java] view
plain copy
public class Department {
private int id;
private String deptName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Department() {
super();
// TODO Auto-generated constructor stub
}
public Department(int id, String deptName) {
super();
this.id = id;
this.deptName = deptName;
}
@Override
public String toString() {
return "Department [deptName=" + deptName + ", id=" + id + "]";
}
}
2. 两个表操作的接口
[java] view
plain copy
public interface IUserDao {
abstract void insert(User user);
abstract User select(int id);
}
[java] view
plain copy
public interface IDepartmentDao {
abstract void insert(Department dept);
abstract Department select(int id);
}
3. IUserDao的MySQL实现和Oracle实现
[java] view
plain copy
public class UserMysqlImpl implements IUserDao {
@Override
public void insert(User user) {
// TODO Auto-generated method stub
System.out.println("User: MySQL实现插入一条记录:"+user.toString());
}
@Override
public User select(int id) {
// TODO Auto-generated method stub
System.out.println("User: MySQL实现查询 :id = "+id);
return null;
}
}
[java] view
plain copy
public class UserOracleImpl implements IUserDao {
@Override
public void insert(User user) {
// TODO Auto-generated method stub
System.out.println("User: Oracle实现插入一条记录:"+user.toString());
}
@Override
public User select(int id) {
// TODO Auto-generated method stub
System.out.println("User: Oracle实现查询 :id = "+id);
return null;
}
}
4. IDepartmentDao的Mysql实现和oracle实现
[java] view
plain copy
public class DepartmentMySqlImpl implements IDepartmentDao {
@Override
public void insert(Department dept) {
// TODO Auto-generated method stub
System.out.println("Department: MySQL实现插入一条记录." + dept.toString());
}
@Override
public Department select(int id) {
// TODO Auto-generated method stub
System.out.println("Department: MySQL查询记录 id = " + id);
return null;
}
}
[java] view
plain copy
public class DepartmentOracleImpl implements IDepartmentDao{
@Override
public void insert(Department dept) {
// TODO Auto-generated method stub
System.out.println("Department: Oracle实现插入一条记录." + dept.toString());
}
@Override
public Department select(int id) {
// TODO Auto-generated method stub
System.out.println("Department: Oracle实现查询一条记录 id = " + id);
return null;
}
}
5.DataAccess类
[java] view
plain copy
public class DataAccess {
private String db;
public IUserDao createUserDao()
throws ClassNotFoundException,
InstantiationException,
IllegalAccessException{
if(db != null && !db.equals("")){
//拼接字符串,注意类名包含包名
String className = "com.design.abstractFactory.product.User" + db +"Impl";
//获取以className字符串为名的类
Class<IUserDao> userDaoImplClass
= (Class<IUserDao>) Class.forName(className);
//返回类的实例
return userDaoImplClass.newInstance();
}
return null;
}
public IDepartmentDao createDepatDao()
throws ClassNotFoundException,
InstantiationException,
IllegalAccessException{
if(db != null && !db.equals("")){
//拼接字符串,注意类名包括包名
String className = "com.design.abstractFactory.product.Department" + db +"Impl";
//获取以className字符串为名的类
Class<IDepartmentDao> deptDaoImplClass
= (Class<IDepartmentDao>) Class.forName(className);
//返回类的实例
return deptDaoImplClass.newInstance();
}
return null;
}
public String getDb() {
return db;
}
public void setDb(String db) {
this.db = db;
}
}
6. client端
[java] view
plain copy
public class abstractFactoryTest {
@Test
public void testDataAccess() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{
Properties proper = new Properties();
InputStream is
= this.getClass().getClassLoader().getResourceAsStream("DB.properties");
proper.load(is);
String db = proper.getProperty("db");
DataAccess dataAcc = new DataAccess();
dataAcc.setDb(db);
IUserDao userDao = dataAcc.createUserDao();
IDepartmentDao deptDao = dataAcc.createDepatDao();
User user = new User(1, "pathfiner");
Department dept = new Department(1, "aaa");
userDao.insert(user);
deptDao.select(1);
}
}
DB.properties
[java] view
plain copy
db=MySql
相关文章推荐
- 结合Java反射用简单工厂模式改进抽象工厂模式
- 简单工厂模式+反射来改进抽象工厂模式
- 使用Java5特性来简化反射编程
- 使用Java5特性来简化反射编程
- JAVA反射使用手记
- JML起步---使用JML 改进你的Java程序(3)
- JAVA反射使用手记
- 在Java中使用反射分析类结构
- JML起步---使用JML 改进你的Java程序(4)
- 使用Java5特性来简化反射编程
- 通过反射动态使用Java类(转)
- JML起步---使用JML 改进你的Java程序(2)
- 使用JML改进你的Java程序
- 使用Java5特性来简化反射编程
- 使用java反射操作类的构造函数,成员变量和成员方法
- JAVA反射使用手记
- Java工厂模式---之简单工厂模式,工厂模式,抽象工厂模式
- 使用 java 的反射 和 comparator 实现java bean 的简单排序
- 使用Java5特性来简化反射编程
- Java 可复用的面向对象的设计模式之 工厂模式Factory详解 :简单工厂模式 工厂方法模式 抽象工厂模式