2010-11-12 1 views
3

Если у меня есть две сущности, Parent и Child, 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 

мне нужно использовать фабрику здесь делать? И если да, то как?

Благодаря

ответ

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

Если конструктор Ребенок нуждается аргументы, вы можете передавать их методу createChild.

+0

Да, но это все равно вывело бы «родительский сеттер» на любые другие объекты, которые хотели бы создать ребенка. Я хочу сказать, что только родитель должен иметь возможность установить родительский элемент дочернего элемента. Это необоснованное требование? Или это добавит слишком много накладных расходов/сложности? –

+0

@Piotr: Это тот момент, когда нужно, чтобы родители и дети более глубоко осознавали друг друга. В Java вы сделаете это, поставив их в один и тот же пакет. В C++ у них был бы доступ только друг к другу. (Я знаю, что в C# должен быть эквивалент, но я этого не знаю.) –

+0

Если вы хотите скрыть родительский сеттер, вы можете пойти на создание дочернего образа на основе конструктора на основе SWT. – Vladimir

2

Вы не ограничены одним подходом. Вы должны использовать подход, который вам подходит.

В SWT ребенок связан с родителем в конструкторе:

new Label(parentComposite, SWT.NONE); 

После этого parentComposite знает своего ребенка.

Примечание: SWT требует создания родительского элемента, что ограничивает некоторые функции - вы не можете создать дочерний элемент без указания дочернего элемента. Это ограничение SWT.

В Swing вы можете создать дочерний виджет, а затем добавить его в родительский.

Указанные выше примеры. Ваше личное решение будет основываться на ваших потребностях.

Я хотел бы рассмотреть использовать меньше методы, большую согласованность (не оставляйте ваш ребенок отсоединили от родителя)

Говоря о коде я бы использовать следующий метод:

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

Надежда, что помогает. Счастливое проектирование!

+0

Благодарим вас за ответ, можете ли вы, пожалуйста, проверить ответ Sauls и мой комментарий к нему и комментарий? –

2

Как насчет сделать что-то вроде этого:

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

Таким образом, вы можете установить родителя ребенка только при создании ребенка.