2012-02-10 12 views
3

抽象ファクトリパターンを使用してDAOを設定しています。それは次のようになります。DAO /抽象ファクトリパターン - 複数のデータソース

public abstract class DaoFactory 
    public static GetDaoFactory() 
    public abstract IPersonDao GetPersonDao() 
    // etc. 

静的GetDaoFactory()は、基礎となるSqlDaoFactoryを返します。今日まで、すべてのDaosは同じSQLデータベースで作業してきました。今、別のDAOをこのファクトリに追加したいと思いますが、DAOはSQLデータベースの代わりに外部サービスと対話します(これはGetCompanyDao()としましょう)。このGetCompanyDao()メソッドを抽象的なDaoFactoryクラスに追加するだけで、パブリックインターフェイスは基本的な実装から完全に切り離されます(特定のDAがSQLまたは外部サービスを使用しているかどうかを知る必要はありません)。

SqlDaoFactoryの名前を変更してGetCompanyDao()メソッドを含めるだけでよいので、このDAOファセットはいくつかのDAOにSQLを使用し、もう一方は外部サービスを使用するようにする必要がありますか?あるいは、これを達成するための別の方法がありますか?

答えて

3

名前を変更すると完全にあなたの名前に変更されます。 DAOパターンは、あらゆるタイプのデータアクセスを抽象化し、必ずしもデータベースアクセスではない。だから間違いなくあなたの計画を進めることができます。

手動でパターンを作成する代わりに、スプリングのようなフレームワークを使用できます。

私はこれらのパターンをハードコーディングしてみました。

public abstract class DAOFactory { 

    // List of DAO types supported by the factory 
    public static final int MYSQL = 1; 
    public static final int ORACLE = 2; 
    public abstract UserDAO getUserDAO() throws SQLException; 
    public static DAOFactory getDAOFactory(int whichFactory) { 

    switch (whichFactory) { 
     case MYSQL: 
      return new MySQLDAOFactory(); 
     case ORACLE : 
      ...... 


public class MySQLDAOFactory extends DAOFactory { 

    public MySQLDAOFactory() { 
    } 
    public static final String DRIVER= "/*driver here*/"; 
    public static final String DBURL="/*conn string here*/"; 
    /* instead of using constants you could read them from an external xml file*/ 

    public static Connection createConnection() { 
     /*create connection object here*/ 
     return conn; 
    } 
    public UserDAO getUserDAO() throws SQLException{ 
     return new MySQLUserDAO(); 
    } 

public interface UserDAO { 
    public int insertUser(String fname, String lname); 
    public ArrayList<User> selectUsers(); 
} 

public class MySQLUserDAO implements UserDAO { 

    Connection conn=null; 
    Statement s=null; 
    public MySQLUserDAO() throws SQLException{ 
     conn = MySQLDAOFactory.createConnection(); 
     s = conn.createStatement(); 
    } 

    public int insertUser(String fname, String lname) 
    { 
     //implementation 
    } 


    public ArrayList<User> selectUsers() 
    { 
     //implementation 
    } 
3

Strategy Patternとお考えですか? SQLまたは外部サービス・アクセス・ロジックはConcreteStrategyとして実装できますが、ユーザーはStrategyインタフェースを参照するだけで済みます。

0

thisのようにすることができます。そこに図9.8を見てください。あなたが対象となる工場表すパラメータを取るためにあなたの抽象クラスでGetDaoFactory方法を変更され それでは、あなたが実際にやっていることは、SqlDaoFactoryまたはExternalServiceDaoFactory

1

は、あなたのDAOの構成されたインスタンスを事前に参照を取得するために、Springフレームワークのような依存性注入コンテナを(使用を検討しますたとえば、Springでは、OracleデータベースにアクセスするDAOを定義するXMLファイルや、他のデータベースベンダーにアクセスするDAOを定義するその他のファイルを記述することができます:適切なバージョンでデプロイするだけでアプリケーションが動作します。

また、2つの事柄:

1)でDAOパターンがテントは、データソース(データベース、Webサービス、プロパティファイルなど)を抽象化しようとします。通常、その使用はデータベースアクセスのみで行われます。他のデータソースアクセス層では、 "サービス"オブジェクトのように定義できます。

2)実際に別のデータソースを使用するようにアプリケーションを展開する予定がない限り(現時点または将来の予定)、ファクトリオブジェクトの導入には意味がなく、汎用DAOインターフェイス各DAOについて

関連する問題