【发布时间】:2019-01-27 13:41:51
【问题描述】:
这是我第一次使用this design pattern,我遇到了一些困难。以此图为参考:
我有两个 AbstractProduct 我想为其创建一个工厂,因为它们属于不同的“家族”。一种产品是另一种产品的集合。
public abstract class Frame{
...
}
public abstract class FrameMap<F extends Frame>{
protected TreeMap<Integer, F> map;
public F readByKey(Integer key){
return this.map.get(key);
}
public void put(Integer key, F frame){
this.map.put(key,frame);
}
...
}
注意FrameMap 是F 的集合(为简单起见,我省略了大部分其他方法),因此它需要能够获取和放置元素。
以一个家庭为例(App1 的那个)这些是具体的产品:
public class App1Frame extends Frame{
...
}
public class App1FrameMap extends FrameMap<App1Frame>{
...
}
然后我创建了AbstractFactory:
public abstract class ApplicationFactory{
//Frame factory methods
public abstract Frame makeFrame();
//FrameMap factory methods
public abstract FrameMap<? extends Frame> makeFrameMap();
}
以及 App1 的 ConcreteFactory:
public class App1Factory extends ApplicationFactory{
//Frame factory methods
public Frame makeFrame(){
return new App1Frame();
}
//FrameMap factory methods
public FrameMap<App1Frame> makeFrameMap(){
return new App1FrameMap();
}
}
所有这些都可以编译,但我不太喜欢它,因为我的客户无法执行以下操作:
ApplicationFactory factory = new App1Factory();
FrameMap<Frame> frameMap = factory.makeFrameMap(); //This doesn't compile!
至少在概念上,这是该模式的目标,即让客户端只使用抽象类。为了让它工作,我必须做这样的事情:
App1Factory factory = new App1Factory();
FrameMap<App1Frame> frameMap = factory.makeFrameMap(); //This compiles!
这似乎违背了使用设计模式的目的。
您是否知道在像我这样的情况下实现此模式的更好方法,即在 AbstractProduct 中使用泛型,以便让客户端只使用抽象类而不知道底层实现?
【问题讨论】:
-
工厂模式已经过时,有利于依赖注入/控制反转。您是否考虑过改用它?
-
你能再具体一点吗?我对 DI 不太熟悉,但乍一看我不明白它如何解决我的问题。
标签: java generics design-patterns abstract-factory