Menu

* キーワード [#z734472a]
- エンティティ
- 生成
-- インスタンス

* 何か [#bbd0dc61]

 専門工場

インスタンスの生成をするための専用クラスを設けます。

* なぜか [#yf0a62bc]

インスタンスを生成する(完全なインスタンスの状態を用意する)のに必要な属性情報を組み立てる手順を要する場合があります。この組み立ての手順はドメインモデルにおいてどのクラスの責務にもなりません。

生成される側が組み立てようとすると、たとえばエンティティとして設計したクラスがアプリケーション上の制約(たとえばリクエスト情報を使用するなど)と密な関係になってしまいます。生成する側が組み立てようとすると、コントロールとして設計したクラスが処理の流れ(: 本来メッセージのやりとりだけで表現したいもの)以上の仕事を過剰に負ってしまいます。

- どのモデルの仕事としても不適合
- アプリケーション上の制約と密になる
- 組み立ての手順によって仕事が過剰になる

そこで、インスタンスの生成を専門の責務にするファクトリを設けます。

* どのように [#h6fcd733]

ファクトリによってインスタンスを生成するようにします。

 UserEntityFactory factory = new UserEntityFactory();
 UserEntity user = factory.createUser("haruki", "fukuchi", "B");

ファクトリは完全なインスタンスとしての整合性や妥当性を保証します。

 UserEntityFactory {
 
   createUser(firstName, lastName, bloodType) {
     UserEntity user = new UserEntity();
     /*
      * 組み立てるための手続き
      */
     return user;
   }
 
 }

* 関連 [#tbaa8f44]
- [[設計パターン/リポジトリ]]
- [[設計パターン/ビルダー]]
- [[設計パターン/完全コンストラクタ]]
- [[設計パターン/リポジトリ]]

* 参考 [#ud1f8881]
- [[ドメイン駆動設計・アプリケーション構築編・ファクトリ - Strategic Choice>http://d.hatena.ne.jp/asakichy/20110531/1306794692]]
- [[オブジェクト思考: Factory (ファクトリ) パターン>http://think-on-object.blogspot.jp/2011/11/factoryfactory-methodabstract-factory.html]]