知识卡片
工厂模式:把复杂对象创建过程从聚合根剥离
内容
聚合内实体和值对象比较多、依赖关系复杂时,创建DO对象要确保聚合根和它依赖的对象实例被同时正确创建,如果把这项创建工作全部交给聚合根自己的构造函数来完成,聚合根构造函数的逻辑会变得非常复杂,聚合根也就无法专注于自身真正该关心的领域逻辑。工厂模式的做法是把这类和领域模型业务逻辑本身无关、但确实必要的”通用创建工作”从聚合根中剥离出来,单独放进工厂里实现,由工厂封装聚合内复杂对象的创建过程——这样做还有一个附带好处:可以隐藏聚合内部对象的创建细节,不对外暴露聚合的内部结构。工厂通常和仓储配合完成两类场景的转换:一是构建DO对象时,先通过仓储从数据库取出PO对象,再通过工厂把PO转换、初始化成DO对象;二是持久化DO对象时,先通过工厂把DO对象转换成PO对象,再交给仓储完成持久化。并不是所有聚合都需要工厂模式——对象关系简单、构造过程不复杂的聚合,仍然可以直接用聚合根自己的构造函数完成对象创建和初始化,工厂模式是专门用来应对”聚合内部对象创建本身就很复杂”这类场景的,不必强行套用到所有聚合上。
参考来源
- 位置:第8章《聚合和聚合根:怎样设计聚合》"8.5.2 工厂模式"(源文件:_epub-src/OEBPS/Text/chapter3-4-5-2.xhtml)
- 结论依据:原文说明"如果将这项工作全部交由聚合根来实现,聚合根构造函数的逻辑将会非常复杂,聚合根也无法聚焦于自身的领域逻辑。为了让聚合根专注于领域模型,我们尽量将这些比较通用的,与领域模型业务逻辑无关的工作,从聚合根中剥离,将它们放到工厂中实现……这样也可以隐藏聚合内DO对象的创建过程,避免暴露聚合的内部结构",直接支撑本卡片结论。
- 原始内容:为了让聚合根专注于领域模型,我们尽量将这些比较通用的,与领域模型业务逻辑无关的工作,从聚合根中剥离,将它们放到工厂中实现,通过工厂封装聚合内复杂对象的创建过程,完成聚合根、实体和值对象等DO对象的创建。