2010-11-12 49 views
3

如果我有两个实体,ParentChildParent需要了解其所有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 

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

谢谢

回答

2

一个选项是在父类上有一个相关的实例方法。在这里可能不需要静态工厂,因为您正在对现有对象进行操作,只需将对象与另一个对象连接。

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) { 
     // ... 
    } 
} 

如果孩子构造函数需要的参数,可以把它们的createChild方法。

+0

是的,但这仍然会将“父设置者”暴露给任何其他想要创建子对象的对象。我的观点是,只有父母应该能够设置一个孩子的父母。这是不合理的要求吗?还是会增加太多开销/复杂性? – 2010-11-12 09:28:18

+0

@Piotr:当你需要让家长和孩子更深入地了解彼此时,这就是关键所在。在Java中,你可以通过将它们放在同一个包中来做到这一点。在C++中,他们只能访问对方的朋友。 (我知道在C#中必须有一个等价物,但我不知道它。) – 2010-11-12 09:31:25

+0

如果您的目标是隐藏父设置器,则可以使用基于SWT的基于构造函数的子创建。 – Vladimir 2010-11-12 09:32:19

2

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

在SWT孩子链接到父在构造函数中:

new Label(parentComposite, SWT.NONE); 

之后parentComposite知道它的孩子。

注意:SWT要求创建时限制某些功能的父级 - 您不能在没有指定子级的情况下创建子级。这是SWT的限制。

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

那些仅仅是例子。您的个人解决方案将基于您的需求。

我会考虑使用较少的方法,更多的一致性(不要离开你的孩子从父无关联)

谈到代码,我会用下面的方法:

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

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

+0

谢谢你的回答,你能查看Sauls的回答和我对它的评论和评论吗? – 2010-11-12 09:31:04

2

如何做这样的事情:

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

所以,你可以设置父到子仅在创建子。