我理解这两种模式(我认为),但鉴于我的特定需求,我似乎无法找到解决方案或找到示例(所有示例都非常简单)。
我的问题是我想要某种工厂(或主管/等)来创建可能具有或不具有依赖关系的对象。
假设我有这段代码:(我使用的是 C#)
interface MyObject{
public void load();
public void update();
public void draw();
}
class ObjectA : MyObject{
public void load(){/*load*/}
public void update(){/*update*/}
public void draw(){/*draw*/}
}
class ObjectB : MyObject{
Texture texture;
public ObjectB(Content content){
texture = content.load("texture");
}
public void load(){/*load*/}
public void update(){/*update*/}
public void draw(){/*draw*/}
}
class ObjectC : MyObject{
Parent parent;
public void setParent(Parent parent){
this.parent = parent;
}
public void load(){/*load*/}
public void update(){
if( this.status == Status.Done ){
parent.remove(this);
}
}
public void draw(){/*draw*/}
}
class Map : Parent{
MyObject myobj;
public void load(MapInfo map){
//This is what I want to achieve
myobj = MyObjectFactory.create(map.objectInfo);
//This is my problem. I don't really know how to solve this.
//I can't do this >
myobj.setParent(this); //error
//Unless I create a setParent method in interface, I don't know how to achieve this.
}
public void remove(MyObject obj){/*remove*/}
}
我真的不知道如何实现这一点:myobj.setParent(this);
。它不能在构造函数中(如 ObjectB),因为 Parent 在每种情况下都不相同。
这就是我的工厂所拥有的:
class MyObjectFactory{
Content content;
public MyObjectFactory(Content content){
this.content = content;
}
public MyObject create(objectInfo){ //suppose objectInfo is xml
//read xml
Type type = objectInfo.type;
//I'm totally fine with this. (Noob implementation)
switch(type){
case Type.A:
return new ObjectA();
break;
case Type.B:
//I'm also fine with this, unless there is a better way.
return new ObjectB(this.content);
break;
case Type.C:
return new ObjectC();
break;
}
}
}
到目前为止,ObjectA 和 ObjectB 都很好。对象A 很简单。ObjectB 构造函数由 Factory 设置(之前为 Factory 提供了content
变量)。
剩下的就是 ObjectC,它需要 Parent 移除自己(它可能不是最好的例子。试图模拟不同的需求)。我如何实现这一目标?
我只想出了一个解决方案:向 MyObject 接口添加一个方法,ObjectA 和 ObjectB 将只有一个什么都不做的 setParent 方法。
我希望这不会令人困惑。
编辑
我忘记在以下位置添加父级:class Map : Parent