java – 何时使用抽象工厂模式?

前端之家收集整理的这篇文章主要介绍了java – 何时使用抽象工厂模式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想知道何时需要使用抽象工厂模式.

这是一个例子,我想知道是否有必要.

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 {
    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都被赋予
相应的算法.

调用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服务应该实现工厂还是可以使用您描述的存储库?答案再次取决于细节:

>对于网络服务,这是正常的
期待多个并发客户端
>因此执行的实例
两个客户的流程绝对不能
影响彼此
>这意味着他们必须没有共享状态
>工厂提供新的实例
每个请求,所以没有共享状态
当您使用工厂模式时
>如果(且仅当)您的实例
存储库是无国籍的
网络服务也可以使用
为此描述的存储库
他们可能需要实例化
实际执行的其他对象
基于请求的过程
参数传递

猜你在找的Java相关文章