複雑なオブジェクトの生成処理を定義するオブジェクト。

オブジェクトの生成過程もドメイン知識といえる。

例:ユーザーIDの自動採番

  • UserクラスのコンストラクタでDBの採番テーブルからIDを取得
    • これはNG。特定の技術要素に偏っている
  • UserFactoryで自動採番したUserクラスのインスタンスを返す
    • これはOK。
    • インターフェイスを定義すれば、採番処理を別の方法にも置き換えられる。
public interface IUserFactory
{
  User Create(UserName name);
}

ファクトリメソッド

なんらかのオブジェクトのインスタンス化で必要な、自身のフィールドをゲッターで公開したくない場合に代わりにインスタンスを生成して返せる。

public class User
{
  private readonly UserId id;
 
  public Circle CreateCircle(circleName circleName){
    return new Circle(
      id,
      circleName
    );
  }
}