エリックエヴァンスのドメイン駆動設計を読んでいる(第2部 第6章-2)

ファクトリ

オブジェクトの作成をどこの責務にするべきか?

オブジェクトは作成された後に用途にあった様々な責務を持つ。 自分自身を作成するということはオブジェクトのライフサイクルの一番最初にはあるが、それ以降は出てこない。 責務はカプセル化して明快なものをシンプルにもたせたいので、一番初めに一度しか使われないような責務は持たせるべきではないという意味だと思います。

一方でオブジェクトを使用するクライアント側にその責務を持たせるのはより問題が大きくなる。 様々な箇所で自由にオブジェクトが生成されるようになるので、リファクタリングができないし、オブジェクトの生成についての知識をクライアントが知っている必要があるためです。 ドメインでの知識が別のそうに流出しているという表現をしますが、これはレイヤー化アーキテクチャ的によくないわけです。

なので、ファクトリというエンティティやバリューオブジェクトとは異なる新たな要素をドメイン層の要素として追加します。

ファクトリの責務は、オブフェクトを生成することであり、集約の制約から、集約の範囲内のオブジェクトはすべて同じタイミングで扱われるべきであるため、ファクトリはオブジェクトを作成する際には集約のすべてのオブジェクトを一度に作成します。

うちのプロジェクトではScalaを使ってますが、エンティティをcase objectとして定義し、そのコンパニオンオブジェクトのapplyメソッドをファクトリとして扱うことが多いです。あえて別にファクトリを作成してもいいんですが、結局ファクトリでやっていることとコンパニオンオブジェクトのapplyメソッドでやろうとすることに違いはなかったのでそのような形にしています。