|
我想知道何时需要使用抽象工厂模式.
这是一个例子,我想知道是否有必要.
The 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
Test.properties的内容只有一行:
dao=net.SqlDao,net.SqlDao
所以任何事情都可以告诉我这种适应是否必要?
——————-以下内容是为了解释真实的诉讼————–
我用Dao的例子是因为它很常见,任何人都知道.
事实上,我现在正在工作的与DAO无关,我正在努力建立一个Web
服务,web服务包含一些算法将文件转换为其他格式,
例如:net.CreatePDF,net.CreateWord等,它向客户端公开两个接口:getAlgorithms和doProcess.
getAlogrithoms将返回所有算法的id,每个id都被赋予 相应的算法.
调用doProcess方法的用户还将提供他想要的算法ID.
所有算法都扩展了AbstractAlgorithm,它定义了run()方法.
我使用AlogrithmsRepository存储所有算法(来自
属性文件,用于通过Web配置算法的具体java类
服务管理员.)也就是说,Web服务公开的接口DoProcess是
由具体的算法执行.
我举一个简单的例子: 1)用户发送getAlgorithms请求:
http://host:port/ws?request=getAlgorithms
然后用户将获得嵌入在xml中的算法列表.
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文件发送给用户.
BTW,在这个例子中,每个算法类似于sqlDao,AccessDao. 这是图像:
The design image
现在,AlgorithmRepostory是否需要使用抽象工厂?
最佳答案
这两种方法的主要区别在于,前者使用不同的DAO工厂来创建DAO,而底部的工厂存储一组DAO,并返回对存储库中DAO的引用.
如果多个线程需要访问相同类型的DAO,那么底层方法就会出现问题,因为JDBC连接未同步.
这可以通过让DAO实现newInstance()方法来修复,该方法只是创建并返回一个新的DAO.
abstract class AbstractDao {
public abstract String getID();
public abstract void insert();
public abstract void update();
public abstract AbstractDao newInstance();
}
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");}
public AbstractDao newInstance() { return new SqlDao();}
}
存储库可以使用存储库中的DAO作为存储库返回的DAO的工厂(在这种情况下我将重命名为Factory),如下所示:
public AbstractDao newDao(String id) {
return daoMap.containsKey(id) ? daoMap.get(id).newInstance() : null;
}
更新
至于您的问题,您的Web服务应该实现工厂还是可以使用您描述的存储库?答案再次取决于细节:
>对于网络服务,这是正常的 期待多个并发客户端 >因此执行的实例 两个客户的流程绝对不能 影响彼此 >这意味着他们必须没有共享状态 >工厂提供新的实例 每个请求,所以没有共享状态 当您使用工厂模式时 >如果(且仅当)您的实例 存储库是无国籍的 网络服务也可以使用 为此描述的存储库 他们可能需要实例化 实际执行的其他对象 基于请求的过程 参数传递 (编辑:安卓应用网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|