这是我第一次使用这种设计模式,我遇到了一些困难。以此图为参考:
我有两个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 的家庭),这些是具体的Product:
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 中使用泛型,以便让客户端只使用抽象类而不知道底层实现?
暮色呼如
jeck猫
相关分类