3

現在、抽象ファクトリパターンを使用していくつかのDAOを設定しています。これは次のようになります。

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

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

このDAOファコトリーが一部のDAOにSQLを使用し、他のDAOに外部サービスを使用するように、単に名前SqlDaoFactoryをより適切な名前に変更し、そこにメソッドを含める必要がありますか?GetCompanyDao()または、これを達成するための別の方法はありますか?

4

4 に答える 4

3

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

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

これらのパターンを一度だけハードコーディングしてみました。

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
    }
于 2012-02-20T10:12:38.293 に答える
3

戦略パターンを検討しましたか。SQL または外部サービス アクセス ロジックは ConcreteStrategy として実装できますが、ユーザーは Strategy インターフェースを見るだけで済みます。

于 2012-02-14T12:57:31.427 に答える
1

依存性注入コンテナ(Springフレームワークなど)を使用して、DAOまたは他の種類のサービスの事前構成されたインスタンスへの参照を取得することを検討してください。たとえば、Springでは、OracleデータベースにアクセスするDAOを定義するXMLファイル、およびアクセスするDAOを定義する他のファイルを記述できます。別のデータベースベンダー:適切なバージョンでデプロイするだけで、アプリが機能します。

また、2つのこと:

1)DAOパターンインテントはあらゆる種類のデータソース(データベース、Webサービス、プロパティファイルなど)を抽象化しようとしますが、その使用は通常、データベースアクセスのみに関連付けられます。「サービス」オブジェクトのように定義できるその他のデータソースアクセスレイヤー。

2)補足コメントとして、実際にアプリをさまざまなデータソースを使用するようにデプロイすることを計画していない限り(現在または近い将来)、ファクトリオブジェクトと各DAOの汎用DAOインターフェイスを導入しても意味がありません。

于 2012-02-20T02:28:13.607 に答える
0

このようにできます。そこで図 9.8 を見てください。したがって、実際に行うことは、抽象クラスの GetDaoFactory メソッドを変更して、必要なファクトリ (SqlDaoFactory または ExternalServiceDaoFactory) を表すパラメーターを取得することです。

于 2012-02-18T16:20:36.243 に答える