class Person { Computer myComputer; }
class Computer { Person myOwner; }
當嘗試用工廠創建「小明」並賦予「HP 電腦」時,工廠陷入無限遞歸:創建 Person → 需 Computer → 需 Person → …
// 工廠只負責創建單個對象
Person p = personFactory.create("小明");
Computer c = computerFactory.create("HP");
// 由上層協調者(或 Builder)建立關聯
p.setComputer(c);
c.setOwner(p);
✅ 符合現實邏輯 ✅ 解除構造期循環 ⚠️ 需確保調用方正確設置
若 Computer 不需主動持有 Owner 引用,改為 WeakReference<Person> 或移除該字段,僅保留 Person → Computer 單向關聯。單向依賴天然無循環。
class OwnershipService {
void assign(Person p, Computer c) { ... } // 管理關聯、持久化、事件發布
}
將雙向關聯提升為領域服務,工廠只創建獨立實體,關聯由服務層管理。
循環依賴本質是領域建模與對象創建策略不匹配。優先調整模型(單向/弱引用/中介者),再配合 Builder 或分階段工廠組裝,即可優雅化解。