为什么我需要FactorySupplier?

时间:2014-08-05 15:17:42

标签: java design-patterns factory factory-pattern

在我正在进行的项目中(不是我的项目,只是在处理它),有很多这样的结构:

project.priv.logic.MyServiceImpl.java
project.priv.service.MyServiceFactoryImpl.java

project.pub.logic.MyServiceIF.java
project.pub.service.MyServiceFactoryIF.java
project.pub.service.MyServiceFactorySupplier.java

服务就像这样调用:

MyServiceFactorySupplier.getMyServiceFactory().getMyService()

我了解如果MyServiceImpl的位置或内容发生变化,则会使用工厂隐藏MyServiceImpl的实施。但为什么我的工厂(供应商)还有另一家工厂?我认为我的Factory和FactorySupplier改变的概率大致相等。另外我还没有找到一个案例,其中创建的工厂是动态创建的(我认为这将是抽象工厂模式中的情况),但只返回MyServiceFactoryImpl.getInstance()。通常的做法是实施FactorySupplier吗?有什么好处?

2 个答案:

答案 0 :(得分:1)

假设您有一个实现MyServiceIF的类的层次结构。

假设您具有匹配的工厂类层次结构,以创建原始层次结构中的每个实例。

在这种情况下,MyServiceFactorySupplier可能有一个可用工厂的注册表,您可能会调用getMyServiceFactory(parameter),其中参数确定将实例化哪个工厂(因此是哪个类的实例)将由工厂创建。

我不知道这是否是您项目中的用例,但它是一个有效的用例。

这是我的意思的代码示例:

public class MyServiceImpl implements MyServiceIF 
{
....
}

public class MyServiceImpl2 implements MyServiceIF
{
....
}

public class MyServiceFactoryImpl implements MyServiceFactoryIF
{
    ....
    public MyServiceIF getMyService ()
    {
        return new MyServiceImpl ();
    }
    ....
}

public class MyServiceFactoryImpl2 implements MyServiceFactoryIF
{
    ....
    public MyServiceIF getMyService ()
    {
        return new MyServiceImpl2 ();
    }
    ....
}

public class MyServiceFactorySupplier
{
    ....
    public static MyServiceFactoryIF getMyServiceFactory()
    {
        return new MyServiceFactoryImpl (); // default factory
    }

    public static MyServiceFactoryIF getMyServiceFactory(String type)
    {
        Class serviceClass = _registry.get(type);
        if (serviceClass != null) {
            return serviceClass.newInstance ();
        } else {
            return getMyServiceFactory(); // default factory
        }
    }
    ....
}

我有一个相关的类层次结构,它们由工厂层次结构实例化。虽然我没有FactorySupplier类,但我在工厂层次结构的基类中有一个静态方法BaseFactory.getInstance(parameter),它返回一个依赖于传递参数的工厂实例。

答案 1 :(得分:1)

我可以想到这个模式可能有用的几个例子(一些非常人为的)。通常,您的服务有两个或更多实现,例如

  • 一个用于生产用途/一个用于测试
  • 访问数据库的服务的一个实现,另一个用于访问文件库存储的实现
  • 针对不同语言环境的不同实现(翻译,日期和数字的格式化等)
  • 您要访问的每种类型的数据库的一个实现

在每个示例中,在启动应用程序时都需要初始化FactorySupplier,例如使用区域设置或数据库类型对FactorySupplier进行参数化,并根据这些参数生成相应的工厂。

如果我理解正确,您的应用程序中不会包含任何此类代码,而FactorySupplier始终会返回相同类型的工厂。

可能这样做是为了实现可扩展性而不需要的程序,但恕我直言,这看起来就像是猜测应用程序在未来的某个时间可能需要的内容,而不是像有意识的架构选择那样。