2015-10-07 32 views
3

我有一個名爲DatabaseModel的類。什麼是用於通過傳遞引擎對象來創建對象的設計模式名稱

並號召DatabaseEngineInterface有一個方法,如接口: 插入 更新 刪除 選擇

這樣我就可以在運行時間確定要使用的引擎mysqloracle這是一個實現了DatabaseEngineInterface一類

EngineDatabase engine = new MySQLEngine(); 
DatabaseModel db = new DatabaseModel(engine); 

什麼叫這種設計模式?

回答

3

具體而言,這是構造函數注入模式(在my book中描述),這是Strategy pattern的特例。

+0

是什麼使它成爲特殊情況? – faressoft

+0

@faressoft還有其他方法可以實施戰略;例如與物業注入。 –

+0

這與一些如何依賴注入模式有關嗎? – faressoft

0

是不是strategy pattern的執行?維基百科指出,戰略模式是:

>a software design pattern that enables an algorithm's behavior to be selected at runtime 

它還說,該戰略的模式:

  • 定義了一系列的算法,
  • 封裝每個算法,並
  • 使得算法互換在那個家庭內。

您允許將用於(等行爲),以在運行時選擇的數據庫。您定義了一系列算法(您的接口),封裝了每個算法(通過爲每個提供程序創建一個類),並且它們可以互換使用,因爲只依賴於接口。

0

DaoFactory設計模式非常適合您的實施。

接口

public interface DatabaseEngineInterface { 
    public void insert(User user); 
    public void update(User user); 
    public void delete(int userId); 
} 

類,它實現上述方法:

public class DatabaseModel implements DatabaseEngineInterface { 
    @Override 
    public void delete(int userId) { 
     // delete user from user table 
    } 

    @Override 
    public User[] findAll() { 
     // get a list of all users from user table 
     return null; 
    } 

    @Override 
    public User findByKey(int userId) { 
     // get a user information if we supply unique userid 
     return null; 
    } 

    @Override 
    public void insert(User user) { 
     // insert user into user table 
    } 

    @Override 
    public void update(User user) { 
     // update user information in user table 
    } 
} 

public class DatabaseModelDAOFactory { 
     public static UserDAO getUserDAO(String type) { 
     if (type.equalsIgnoreCase("mysql")) { 
      return new UserDAOMySQLImpl(); 
     } else { 
      return new UserDAOORACLEImpl(); 
     } 
    } 
} 

客戶端代碼:

然後,在客戶端,而不是像一個硬編碼線:

DatabaseModel userDAO=DatabaseModelDAOFactory.getUserDAODatabaseEngineInterface("jdbc"); 

你可以有一個屬性文件,以便能夠動態的DAO之間進行切換,已經檢索到字符串來自屬性文件,你可以簡單地做:

DatabaseModel userDAO=DatabaseModelDAOFactory.getUserDaoDatabaseEngineInterface(myStringFromPropertiesFile); 

根據屬性文件中的定義,myStringFromPropertiesFile將包含「mysql」或「oracle」。

相關問題