如何正确创建具有循环依赖的两个实体?

时间:2010-11-12 09:15:30

标签: oop design-patterns domain-driven-design

如果我有两个实体,ParentChild,则Parent需要了解其所有Child子项,并且每个Child实例都需要知道它的父Parent实例,我该如何正确地做到这一点(就DDD等而言)?

简单的方法是parent.addChild(new Child(parent)),但这看起来很难看 - 以及:

parent.addChild(new Child()); // Then call some setParent method on child, which needs to be public

我需要在这里使用工厂吗?如果是这样,怎么样?

由于

3 个答案:

答案 0 :(得分:2)

一种选择是在Parent类上使用相关的实例方法。由于您在现有对象上操作并且只需要将对象与另一个对象连接,因此可能不需要静态工厂。

public class Parent {

    // ...

    public Child createChild() {
        Child c = new Child(this);
        this.addChild(c);
        return c;
    }

    protected void addChild(c) {
        // ...
    }

    // ...

}

public class Child {

    public Child(Parent p) {
        // ...
        this.addParent(p);
    }

    protected addParent(Parent p) {
        // ...
    }
}

如果Child构造函数需要参数,则可以将这些参数传递给createChild方法。

答案 1 :(得分:2)

您不仅限于单一方法。你应该使用适合你的方法。

在SWT中,子项与构造函数中的父项链接:

new Label(parentComposite, SWT.NONE);

之后,parentComposite知道它的孩子。

注意:SWT要求创建父级,这限制了某些功能 - 如果不指定子级,则无法创建子级。这是SWT的限制。

在Swing中,您可以创建子窗口小部件,然后将其添加到父窗口。

以上只是示例。您的个人解决方案将基于您的需求。

我会考虑使用更少的方法,更多的一致性(不要让你的孩子与父母取消联系)

谈论代码我将使用以下方法:

Parent {
 addChild(Child child) {
  children.add(child);
  child.setParent(this);
 }
}

希望有所帮助。快乐的设计!

答案 2 :(得分:2)

如何做这样的事情:

public class Child {
   Child (Parent parent) {
      ... 
      this.parent = parent;
      parent.addChild(this);
   }
}

因此,您可以在创建子项时将父项设置为Child。