我想知道什么时候需要使用抽象工厂模式。
这里有一个例子,我想知道是否必要使用它。
上面是抽象工厂模式,它被我的同学推荐。下面是我自己的实现。我不认为使用这个模式是必要的。
以下是一些核心代码:
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的例子是因为它很普遍,任何人都知道。
实际上,我现在所做的与DAO无关,我正在构建一个Web服务,该Web服务包含一些算法来将文件转换为其他格式,例如net.CreatePDF、net.CreateWord等,它向客户端公开两个接口:getAlgorithms和doProcess。
getAlogrithoms将返回所有算法的ID,每个ID都与相应的算法相关联。
调用doProcess方法的用户还将提供他想要的算法ID。
所有算法都扩展了AbstractAlgorithm,其中定义了run()方法。
我使用AlgorithmRepository来存储所有算法(从属性文件中配置算法的具体Java类的Web服务管理器中)。也就是说,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 需要使用抽象工厂吗?