生成者パターン

問題: あるクラスの新しいインスタンスを生成する責任は何が持つべきか
オブジェクトの生成は、[[オブジェクト指向]]システムで最もよく行われるアクティビティの1つです。
したがって、生成の責任の割り当てに一般的な原則があると有用です。
この割り当てがうまく行われた設計は、結合性が疎に保たれ、明確になり、カプセル化と再利用性が促進されます。


解決策: 以下の1つ以上が真であるならば(真が多いほど、より確信が強まる)、クラスBにクラスAのインスタンスを生成する責任を割り当てます。
   * BがAを含む(contain/composition)もしくは、合成物としてAを集約する(aggregate)。
   * BがAを記録する(record)。
   * BがAを密接に使用する(closely use)。
   * BがAの生成時にAに渡される初期化データを持っている(has the initializeing data)。(したがってAの生成に関してはBがエキスパートである。)


このような場合は、BがAオブジェクトの生成者(creator)です。
複数の条件が適合する場合は通常、クラスAを集約する、または、含むクラスをクラスBとして選定してください。


解説: 生成者パターンは、頻繁に登場するオブジェクト生成に関する責任割り当ての指針です。生成者パターンの基本的な目的は、何らかのイベントで生成されるオブジェクトと接続する必要のある生成者を見つけることです。これを生成者として選定することで疎結合性が支援されます。
「合成物が部分を集約する(aggregate)」、「コンテナが内容を含む(contain)」、「記録者が記録対象を記録する(record)」はどれも、クラス図のクラス間でよく見られる関係です。生成者パターンでは、囲い込む側であるコンテナクラスまたは記録者クラスが、含まれる、あるいは記録されるものを生成する責任を持つ候補とすることが提案されます。むろん、これは1つの指針にすぎません。


集約に対するコンポジション: 生成者パターンの考察ではコンポジション(composition:合成)という概念が出てくることに注意してください。コンポジット(合成物)オブジェクトは、その部分を作成する有力な候補です。
生成中に受け渡される初期化データをもっているクラスを探すことで、生成者が見つかる場合もあります。これは実際にはエキスパートパターンの例です。初期化データは、パラメタをもつJavaのコンストラクタのような、何らかの種類の初期化メソッドを介して、生成中に渡されます。


適用できない状況: 多くの場合、生成はかなり複雑なタスクです。パフォーマンス上の理由からリサイクルインスタンスを使用したり、外部のプロパティ値に基づく条件処理を通して、似たようなクラス群の中から1つのインスタンスを生成したりすることがあります。このような場合は、生成者パターンによって提案されるクラスではなく、具象ファクトリ(Concrete Factory)または抽象ファクトリ(Abstract Factory)と呼ばれるヘルパクラスに生成を委譲する方法をお勧めします。


利点: 疎結合性が支援されます。これは、保守における依存性を弱め、再利用の可能性を高めます。結合が密にならないのは、生成者を選定する要因となった既存の関連があるために、生成されたクラスはそれを生成したクラスにとってすでに可視であることが多いからです。


- 関係のあるパターンと原則 -
・疎結合性
・具象ファクトリと抽象ファクトリ
・Whole-Part(全体 対 部分)
最終更新:2009年06月22日 04:17