1. 程式人生 > >結合Java反射用簡單工廠模式改進抽象工廠模式

結合Java反射用簡單工廠模式改進抽象工廠模式

前一篇簡單介紹了抽象工廠模式,結合Java的反射機制,可以用簡單工廠模式來改進抽象工廠模式,減少類的數量,增加可維護性。UML圖如下:


去除IFactory、SqlserverFactory和AccessFactory三個工廠類,取而代之的是DataAccess類,用一個簡單工廠模式來實現。

程式碼示例:

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 + "]";
	}
	
	
}
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. 兩個表操作的介面
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