『究極のC#プログラミング』 デザインパターンミニカタログ

カスタマイズ可能なメソッド
呼び出し側固有の処理は、呼び出し側に記述し、それをデリゲートとしてメソッドの引数に渡す


遅延実行
処理を書いたラムダ式をデリゲート型変数に代入しておき、実行すべきタイミングでそれを呼び出す


nullデリゲート
処理内容が存在しない時に、呼び出し側で条件判断するのではなく、何もしないデリゲートを渡すようにする


判断条件式
bool値を返すデリゲート(Predicate<...>, Func<..., bool>)をラムダ式などで記述して、オブジェクトなどに格納しておき、これを利用して条件判断する
判定式の変更を含む修正の手間がラクになる


コンパイル時にチェック可能な名前付きコレクション
Dictionaryクラスなどは、存在するアイテム名かどうかをコンパイル時にチェックできない
しかし、コンパイル時に使用する名前の範囲が決定している場合は、コンパイル時に名前の正しさをチェックできたほうがよい。
そこで、
・静的クラスにフィールドとして名前を書き、そこに値を入れて使用
・名前や値の列挙はリフレクションを通じて行う
・リフレクションは重いので、必要に応じて列挙結果を保存しておく


汎用雑居クラス
Generalなどの汎用性をイメージさせる名前の静的クラスを作り、そこに固有の居場所をもたないメソッドなどを集める


getter/setterによる参照
プロパティは参照渡しできないが、参照渡しをしたい時がある
そこで、値を読むデリゲートと書くデリゲートを引数にとるメソッドを定義することで、参照渡し可能にする


初期化テンプレートオブジェクト
オブジェクト初期化子はreadonlyのフィールドを初期化できない
そこで、クッションとなる中間オブジェクト(テンプレートオブジェクト)を入れる。
テンプレートオブジェクトから目的のオブジェクトへの暗黙的型変換を定義する


フラットオブジェクト、フラットオブジェクトファクトリ
振る舞いを自由にカスタマイズできるオブジェクト(フラットオブジェクト。継承によって定義が階層化されないという意味)を作りたい
そこで、以下のようなメソッド(ファクトリメソッドと呼ぶ)を用意する
・フラットオブジェクトを作成する
ラムダ式によるメソッド内のローカル変数のキャプチャを利用して、変数の共有を可能にする
1つのファクトリオブジェクトに対して、複数のファクトリメソッドがあってもよい
Create〜という形の名前にするとよい