1

私は両方のパターンを理解していますが(私はそう思います)、私の特定のニーズを考えると、解決策も例も見つけることができないようです(すべての例は本当に単純です)。

私の問題は、依存関係がある場合とない場合があるオブジェクトを作成する、ある種のファクトリ (またはディレクター/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

4

2 に答える 2

3

オブジェクトの作成と動作を混在させていると思います。Factory Method と Builder はどちらも創造的な設計パターンです。したがって、どちらを使用してもオブジェクトを作成できます。これらのパターンは、オブジェクト作成の問題のみを解決することに注意してください。

他の動作面(特定の動作を達成したいと述べたように)は、これらの設計パターンのいずれにも含まれていません。したがって、自分のやり方で柔軟に行うことができますが、OCP、SRP、DIP などの設計原則に留意してください。

this SOの問題は、これらのパターンについて語っています: factory method (1) vs factory(2) vs Builder (3) pattern

于 2012-12-14T05:41:29.417 に答える
1

洗練されていない場合でも、簡単な修正は、「this」をファクトリに渡し、必要な場合にのみファクトリに setParent() を呼び出すことです。これは、ファクトリが実装の詳細を認識しているためです。

   myobj = MyObjectFactory.create(map.objectInfo, this);

   case Type.C:  
     var inst = new ObjectC();  
     inst.setParent(parent);
于 2012-12-14T05:49:28.163 に答える