Я хочу знать, когда нам нужно использовать абстрактный шаблон фабрики.
Вот пример, я хочу знать, если это необходимо.
UML
Выше приведен абстрактный шаблон фабрики, он рекомендован моим одноклассником.Следующее является моей собственной реализацией.Я не думаю, что необходимо использовать шаблон.
И вот некоторые основные коды:
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 - это всего одна строка:
dao=net.SqlDao,net.SqlDao
Значит, кто-нибудь может сказать мне, нужна ли эта помощь?
-------------------добавлен, чтобы объяснить реальное соответствие --------------
Я использую пример Дао, потому что это распространено, каждый знает это.
На самом деле, то, что я сейчас работаю, не связано с DAO, я работаю над созданием веб-сервиса
, веб-сервис содержит несколько алгоритмов для изменения файла в другой формат, например
: net.CreatePDF, net.CreateWord и т. д., он предоставляет клиенту два интерфейса: getAlgorithms и doProcess.
getAlogrithoms будет возвращать все идентификаторы алгоритмов, каждый идентификатор реализуется соответствующим алгоритмом.
Пользователь, который вызывает метод doProcess, также предоставит требуемый идентификатор алгоритма.
Весь алгоритм расширяет AbstractAlgorithm, который определяет метод run ().
Я используюAlogrithmsRepository для хранения всех алгоритмов (из
файла свойств, который конфигурирует конкретные java-классы алгоритмов через веб-администратор службы
). То есть интерфейс 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
когда сервер получит запрос такого типа, он получит конкретный экземпляр алгоритма в соответствии с параметром «attribute» (в этом запросе pdf) из AlgorithmRepostory.И вызовите метод:
AbstractAlgorithm algo=AlgorithmRepostory.getAlgo("pdf");
algo.start();
Затем пользователю будет отправлен файл PDF.
Кстати, в этом примере каждый алгоритм аналогичен sqlDao, AccessDao.Вот изображение:
Изображение дизайна
Теперь, нужно ли AlgorithmRepostory использовать абстрактную фабрику?