Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 设计-建造或工厂模式_Oop_Design Patterns_Factory_Builder - Fatal编程技术网

Oop 设计-建造或工厂模式

Oop 设计-建造或工厂模式,oop,design-patterns,factory,builder,Oop,Design Patterns,Factory,Builder,我理解这两种模式(我想),但鉴于我的特殊需要,我似乎既找不到解决方案,也找不到示例(所有示例都非常简单) 我的问题是,我需要某种工厂(或director/etc)来创建可能有依赖关系也可能没有依赖关系的对象 假设我有以下代码:(我使用的是C#) 我真的不知道如何实现这一点:myobj.setParent(这个)。它不能在构造函数中(如ObjectB),因为父对象在每种情况下都不相同。 这就是我为我的工厂所做的: class MyObjectFactory{ Content content

我理解这两种模式(我想),但鉴于我的特殊需要,我似乎既找不到解决方案,也找不到示例(所有示例都非常简单)

我的问题是,我需要某种工厂(或director/etc)来创建可能有依赖关系也可能没有依赖关系的对象

假设我有以下代码:(我使用的是C#)

我真的不知道如何实现这一点:
myobj.setParent(这个)。它不能在构造函数中(如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构造函数由工厂设置(工厂以前被赋予
content
变量)

这就剩下ObjectC了,它需要父对象来删除它自己(这可能不是最好的例子。尝试模拟不同的需求)我如何做到这一点?

我只想到了一个解决方案:向MyObject接口添加一个方法,ObjectA和ObjectB将只有一个不做任何事情的setParent方法

我希望这不会令人困惑

编辑
我忘了在中添加父项:
类映射:父项

我想您将行为与对象创建混为一谈。Factory Method和Builder都是创造性的设计模式。因此,您可以使用其中一个来创建对象。请记住,这些模式只会解决对象创建问题

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


这个问题讨论了这些模式:

我认为您将行为与对象创建混为一谈。Factory Method和Builder都是创造性的设计模式。因此,您可以使用其中一个来创建对象。请记住,这些模式只会解决对象创建问题

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


因此,这个问题涉及到这些模式:

一个简单(如果不是优雅的话)的修复方法是将“this”传递给您的工厂,并仅在需要时让工厂调用setParent(),因为工厂知道实现细节

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

   case Type.C:  
     var inst = new ObjectC();  
     inst.setParent(parent);

一个简单(如果不是优雅的话)的修复方法是将“this”传递给工厂,并且只有在需要时才让工厂调用setParent(),因为工厂知道实现细节

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

   case Type.C:  
     var inst = new ObjectC();  
     inst.setParent(parent);

谢谢你让我意识到创造模式解决不了我想做的事。谢谢你让我意识到创造模式解决不了我想做的事。