我想知道何时需要使用抽象工厂模式.
这是一个例子,我想知道是否有必要.
以上是抽象工厂模式,我的同学推荐.
以下是我的实施.我不认为有必要使用这种模式.
以下是一些核心代码:
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 {
MapsqlDao 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都被赋予
相应的算法.
所有算法都扩展了AbstractAlgorithm,它定义了run()方法.
我使用AlogrithmsRepository存储所有算法(来自
服务管理员.)也就是说,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.
这是图像:
现在,AlgorithmRepostory是否需要使用抽象工厂?
如果多个线程需要访问相同类型的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服务应该实现工厂还是可以使用您描述的存储库?答案再次取决于细节:
>对于网络服务,这是正常的
期待多个并发客户端
>因此执行的实例
两个客户的流程绝对不能
影响彼此
>这意味着他们必须没有共享状态
>工厂提供新的实例
每个请求,所以没有共享状态
当您使用工厂模式时
>如果(且仅当)您的实例
存储库是无国籍的
网络服务也可以使用
为此描述的存储库
他们可能需要实例化
实际执行的其他对象
基于请求的过程
参数传递