結合Java反射用簡單工廠模式改進抽象工廠模式
阿新 • • 發佈:2019-02-17
前一篇簡單介紹了抽象工廠模式,結合Java的反射機制,可以用簡單工廠模式來改進抽象工廠模式,減少類的數量,增加可維護性。UML圖如下:
程式碼示例:
1. 兩個表User和Department的實體類
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 + "]"; } }
2. 兩個表操作的介面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 + "]"; } }
public interface IUserDao {
abstract void insert(User user);
abstract User select(int id);
}
public interface IDepartmentDao {
abstract void insert(Department dept);
abstract Department select(int id);
}
3. IUserDao的MySQL實現和Oracle實現
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; } }
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實現
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;
}
}
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類
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端
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
db=MySql