抽象工廠模式(java)
關鍵字: java 抽象工廠模式工廠模式在項目中是常常用到的,有人說只有大項目才會用到,小項目是體會不出來.其實使用設計模式與項目的大小沒有實質性的聯系.設計模式是經驗的總結而不是衡量項目大小的標準.
以開發項目的DAO層為例,在項目中客戶的需求是常常變動的,臨時更換數據庫的需求也是常常發生的,那我們要如何解決跨數據庫的功能,這里就要使用到抽象工廠模式了.工廠模式常常用于創建多系列化的對象(如Orale系列,MySql系列)
1.首先定義相關接口(與平常的做法沒什么區別)
Java代碼
- // 角色表DAO接口
- interface IroleDao {
- void insert();
- void update();
- }
- // 用戶表DAO接口
- interface IuserDao {
- void find();
- void delete();
- }
2.不同的數據庫有不同的SQL語句所以實現時必須分數據庫來實現
Java代碼
- // 用戶表Oralce數據庫DAO
- class OracleuserDao implements IuserDao {
- public void delete() {
- System.out.println("Oralce 刪除用戶表數據");
- }
- public void find() {
- System.out.println("Oralce 查詢用戶表數據");
- }
- }
- // 用戶表MySql數據庫DAO
- class MySqluserDao implements IuserDao {
- public void delete() {
- System.out.println("MySql 刪除用戶數據");
- }
- public void find() {
- System.out.println("MySql 查詢用戶數據");
- }
- }
- // 角色表Oracle數據庫DAO
- class OracleroleDao implements IroleDao {
- public void insert() {
- System.out.println("Oralce 對角色表插入數據");
- }
- public void update() {
- System.out.println("Oracle 對角色表更新數據");
- }
- }
- // 角色表MySql數據庫DAO
- class MySqlroleDAO implements IroleDao {
- public void insert() {
- System.out.println("MySql 對角色表插入數據");
- }
- public void update() {
- System.out.println("Mysql 對角色表更新數據");
- }
- }
這里增加了一套DAO的實現 (與平時有所不同,如果有10個數據庫就要加上10種不同的實現,比較麻煩呀)
3.定義DAO工廠接口與實現(利用java反射機制生產出你需要的DAO如:userDAO,roleDao)
Java代碼
- // DAO工廠
- abstract class DaoFactory {
- public static DaoFactory getInstance(String classname) {
- DaoFactory dao = null;
- try {
- dao = (DaoFactory) Class.forName(classname).newInstance();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return dao;
- }
- abstract IuserDao getuserdao();
- abstract IroleDao getroledao();
- }
- // Oralce工廠
- class OracleFactory extends DaoFactory {
- public IroleDao getroledao() {
- return new OracleroleDao();
- }
- public IuserDao getuserdao() {
- return new OracleuserDao();
- }
- }
- // MySql工廠
- class MysqlFactory extends DaoFactory {
- public IroleDao getroledao() {
- return new MySqlroleDAO();
- }
- public IuserDao getuserdao() {
- return new MySqluserDao();
- }
- }
4. 定義配置文件
Java代碼
- class Config {
- // Oralce
- static final String ORALCE = "org.abc.OracleFactory";
- static final String MYSQL = "org.abc.MysqlFactory";
- }
配置文件可以定義到XML中去(好處:修改配置項之后不需要對JAVA文件進行編譯.)
5.測試你的輸出的DAO
Java代碼
- public class Dao {
- public static void main(String[] args) {
- DaoFactory.getInstance(Config.ORALCE).getroledao().insert();
- DaoFactory.getInstance(Config.MYSQL).getroledao().insert();
- }
- }
總結
使用條件:一系列接口有一系列的實現
如上IuserDao、IroleDao等一系列的接口,他們可以有一系列的實現(Oracle方式、MySql方式)
OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO
組成元素(以上面例子)
一系列接口:IuserDao、IroleDao
一系列實現:Oracle系列、MySql系列
系列工廠類:Oracle系列工廠類、MySql系列工廠類(必須繼承抽象工廠類)
抽象工廠類:DaoFactory