在我正在进行的项目中(不是我的项目,只是在处理它),有很多这样的结构:
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吗?有什么好处?
答案 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
始终会返回相同类型的工厂。
可能这样做是为了实现可扩展性而不需要的程序,但恕我直言,这看起来就像是猜测应用程序在未来的某个时间可能需要的内容,而不是像有意识的架构选择那样。