我想知道我们什么时候需要使用抽象工厂模式。
这是一个例子,我想知道是否有必要。
以上是抽象工厂模式,是我同学推荐的。以下是我自己的实现。我认为没有必要使用该模式。
以下是一些核心代码:
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
所以任何ont可以告诉我这个西装是否有必要?
--------添加以下说明真正的适合--------------
我用道的例子是因为它很常见,任何人都知道。
其实我现在做的和DAO没有关系,我在做一个Web
服务,网络服务包含一些将文件更改为其他格式的算法,
例如:net.CreatePDF、net.CreateWord 等,它向客户端公开了两个接口:getAlgorithms 和 doProcess。
getAlogrithoms 将返回所有算法的 id,每个 id 都对应于相应的算法。
调用 doProcess 方法的用户也会提供他想要的算法 id。
所有算法都扩展了定义 run() 方法的 AbstractAlgorithm。
我使用 AlogrithmsRepository 来存储所有算法(来自
通过 web 配置算法的具体 java 类的属性文件
service admin)。也就是说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
当服务器收到此类请求时,它会根据“算法”参数(在此请求中为pdf)从AlgorithmRepostory中获取具体的算法实例。并调用方法:
AbstractAlgorithm algo=AlgorithmRepostory.getAlgo("pdf");
algo.start();
然后一个pdf文件将被发送给用户。
顺便说一句,在这个例子中,每个算法都类似于 sqlDao,AccessDao。这是图像:
现在,AlgorithmRepostory 是否需要使用抽象工厂?