1

我理解这两种模式(我认为),但鉴于我的特定需求,我似乎无法找到解决方案或找到示例(所有示例都非常简单)。

我的问题是我想要某种工厂(或主管/等)来创建可能具有或不具有依赖关系的对象。

假设我有这段代码:(我使用的是 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

4

2 回答 2

3

我认为您将行为与 Object creation 混合在一起。工厂方法和生成器都是创建型设计模式。所以你可以使用任何一个来创建对象。请记住,这些模式只会解决您的对象创建问题。

其他行为方面(就像您提到的要实现特定行为)不是这些设计模式中的任何一个的一部分。因此,您可以灵活地按照自己的方式进行操作,但请记住这些设计原则,例如 OCP、SRP、DIP 等。

这个SO问题讨论了这些模式:工厂方法(1)vs工厂(2)vs Builder(3)模式

于 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 回答