抽象ファクトリ パターンを使用する必要がある場合を知りたいです。
ここに例がありますが、必要かどうか知りたいです。
上記は抽象ファクトリのパターンで、クラスメートが推奨しています。以下は私自身の実装です。パターンを使用する必要はないと思います。
そして、以下はいくつかのコアコードです:
package net;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class Test {
public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
DaoRepository dr=new DaoRepository();
AbstractDao dao=dr.findDao("sql");
dao.insert();
}
}
class DaoRepository {
Map<String, AbstractDao> daoMap=new HashMap<String, AbstractDao>();
public DaoRepository () throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
Properties p=new Properties();
p.load(DaoRepository.class.getResourceAsStream("Test.properties"));
initDaos(p);
}
public void initDaos(Properties p) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
String[] daoarray=p.getProperty("dao").split(",");
for(String dao:daoarray) {
AbstractDao ad=(AbstractDao)Class.forName(dao).newInstance();
daoMap.put(ad.getID(),ad);
}
}
public AbstractDao findDao(String id) {return daoMap.get(id);}
}
abstract class AbstractDao {
public abstract String getID();
public abstract void insert();
public abstract void update();
}
class SqlDao extends AbstractDao {
public SqlDao() {}
public String getID() {return "sql";}
public void insert() {System.out.println("sql insert");}
public void update() {System.out.println("sql update");}
}
class AccessDao extends AbstractDao {
public AccessDao() {}
public String getID() {return "access";}
public void insert() {System.out.println("access insert");}
public void update() {System.out.println("access update");}
}
Test.properties の内容はたった 1 行です。
dao=net.SqlDao,net.SqlDao
それで、このスーツが必要かどうかを教えてくれる人はいますか?
-------------------実際のスーツを説明するために以下を追加します--------------
Dao の例を使用するのは、それが一般的であり、誰もが知っているからです。
実は、私が今取り組んでいることはDAOとは関係なく、Webを構築する仕事をしています
サービス、Web サービスには、ファイルを他の形式に変更するためのいくつかのアルゴリズムが含まれています。
たとえば、net.CreatePDF、net.CreateWord などで、getAlgorithms と doProcess の 2 つのインターフェイスをクライアントに公開します。
getAlogrithoms はすべてのアルゴリズムの ID を返します。各 ID は対応するアルゴリズムに関連付けられます。
doProcess メソッドを呼び出すユーザーは、必要なアルゴリズム ID も提供します。
すべてのアルゴリズムは、run() メソッドを定義する AbstractAlgorithm を拡張します。
私はすべてのアルゴリズムを格納するために AlogrithmsRepository を使用します (から
Web によるアルゴリズムの具体的な Java クラスを構成するプロパティ ファイル
つまり、Web サービスによって公開されるインターフェイス DoProcess は
具体的なアルゴリズムによって実行されます。
簡単な例を挙げることができます: 1) ユーザーは getAlgorithms リクエストを送信します:
http://host:port/ws?request=getAlgorithms
次に、ユーザーは xml に埋め込まれたアルゴリズムのリストを取得します。
<AlgorithmsList>
<algorithm>pdf</algorithm>
<algorithm>word<algorithm>
</AlgorithmsList>
2) ユーザーは次の方法で DoProcess をサーバーに送信します。
http://xxx/ws?request=doProcess&alogrithm=pdf&file=http://xx/Test.word
サーバーがこのタイプのリクエストを受け取ると、AlgorithmRepostory から「algorithm」パラメーター (このリクエストでは pdf) に従って具体的なアルゴリズム インスタンスを取得します。そしてメソッドを呼び出します:
AbstractAlgorithm algo=AlgorithmRepostory.getAlgo("pdf");
algo.start();
その後、pdf ファイルがユーザーに送信されます。
ところで、この例では、各アルゴリズムは sqlDao、AccessDao に似ています。画像は次のとおりです。
さて、AlgorithmRepostory は Abstract Factory を使用する必要がありますか?