私は両方のパターンを理解していますが(私はそう思います)、私の特定のニーズを考えると、解決策も例も見つけることができないようです(すべての例は本当に単純です)。
私の問題は、依存関係がある場合とない場合があるオブジェクトを作成する、ある種のファクトリ (またはディレクター/etc) が必要なことです。
このコードがあるとしましょう: (私は 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);
. Parent はすべての状況で同じではないため、(ObjectB のように) コンストラクターに含めることはできません。
これは私が私の工場に持っているものです:
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
変数が与えられていました)。
これで、Parent 自体を削除する必要がある ObjectC が残ります (最適な例ではない可能性があります。さまざまなニーズをシミュレートしようとしています)。どうすればこれを達成できますか?
私が思いついた解決策は 1 つだけです。メソッドを MyObject インターフェイスに追加すると、ObjectA と ObjectB には何もしない setParent メソッドしかありません。
これが混乱しないことを願っています。
編集
親を追加するのを忘れました:class Map : Parent