我理解这两种模式(我认为),但鉴于我的具体需要,我似乎无法找到解决方案或找到一个例子(所有例子都非常简单)。
我的问题是我想要某种工厂(或导演/等)来创建可能有或没有依赖关系的对象。
假设我有这段代码:(我正在使用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都很好。 ObjectA很简单。 ObjectB构造函数由Factory设置(Factory之前已赋予content
变量)。
留下了ObjectC,它需要Parent来自行删除(它可能不是最好的例子。试图模拟不同的需求)。 我如何实现这一目标?
我只提出了一个解决方案:向MyObject接口添加一个方法,ObjectA和ObjectB只有一个不执行任何操作的setParent方法。
我希望这不会令人困惑。
修改
我忘了添加Parent:class Map : Parent
答案 0 :(得分:3)
我认为你混合行为与对象创建。 Factory Method和Builder都是创建设计模式。所以你可以用任何一个来创建对象。请记住,这些模式只会解决您的对象创建问题。
其他行为方面(如您所提到的,您希望实现特定行为)不属于这两种设计模式的一部分。因此,您可以灵活地按照自己的方式行事,但请记住这些设计原则,如OCP,SRP,DIP等。
这个SO问题谈到了这些模式:factory method (1) vs factory(2) vs Builder (3) pattern
答案 1 :(得分:1)
一个简单的(如果不是优雅的)修复方法是将'this'传递给您的工厂,并且只在需要时让工厂调用setParent(),因为工厂知道实现细节。
myobj = MyObjectFactory.create(map.objectInfo, this);
case Type.C:
var inst = new ObjectC();
inst.setParent(parent);