デザパタ
http://codezine.jp/a/article/aid/2804.aspx デザインパターンのSingletonについて書かれた記事。 最も非難されているデザインパターンとは知らなかった。 Singletonはグローバル変数をオブジェクト指向の言葉で表したものにすぎません。 という文にはなる…
本に載っていた一通りのデザインパターンを読み終わり、テストプログラムも作って動作させてみた。なかには簡単なものもあれば、まだしっかりと理解できないほど難しいのもあった。 一通り試したおかげで、だいぶオブジェクト指向の考え方や、部品を再利用す…
文法解析を反映したクラス構造。 簡単に言ってしまえば、BNFで文法を定義し、それを構文解析するということ。それのクラス表現をどうするかということ。 Interpreterがデザインパターンのなかに入っているとは思わなかった。BNFでしっかり定義できてしまえば…
メソッドを呼ぶということ自体をクラスにしてしまう。 あるクラスの処理を実行するにはクラスのメソッドを呼ぶ。その呼ぶということ自体をクラスで表現してしまうのがこのCommandパターン。あるクラスへの要求自体をクラスにしてしまえば、そのインスタンス…
代理人が処理を代行。 インスタンスの生成に時間がかかるようなものはまず代理人で処理を代行し、代理人では実行できない要求がきたときに実際のインスタンスを生成する。 またWebのProxyサーバーのようにアクセス要求がきたとき、そのページをキャッシュし…
インスタンスを共有して無駄をなくす。Flyweightとは「フライ級」のこと。 同じように使いまわせるインスタンスは無駄にnewせずに、最初に作成したものを共有してリソースを節約する。 ゲームではモデルデータやテクスチャデータの扱いにこのFlyweightパター…
状態をクラスとして表現するもの。 これはゲームプログラムでは定番の処理。タイトル、ゲーム中、ゲームオーバーなどの状態をクラスで表現し、それらを切り替えて使用する。 // 状態を表すインタフェース public interface State { public abstract void pro…
直訳すると「記念品」「思い出」という意味。今の状態を保存しておいて、復帰できるようにする。 ゲームで言えばセーブ。今のプレイ状況を保存しておくこと。 以下、プレイヤーデータのHPとMPを保存して復帰する簡単なサンプル。 // セーブデータ(Memento役…
観察者という意味。観察対象の状態が変化したら、観察者に対して通知する。 Model View Controller(MVC)のモデルとビューの関係といったほうが分かりやすいかも。内部データを持つ部分(モデル)と表示する部分(ビュー)を分け、モデルの内部データが更新された…
読み方はメディエイター。仲介者、調停者、まとめ役のこと。 2つのオブジェクトがそれぞれ連携しあって動作するような場合、それぞれのオブジェクトが別のオブジェクトを監視していればよい。ところがもっと数が増え、3つ、4つになってくると大変である。そ…
読み方はファサード。複数のクラスを組み合わせて使う場合にそれらをまとめたクラスを作り、それを窓口として使うこと。 例えば、クラスAとクラスBを組み合わせて使う場合に、クラスAのメソッドを呼んでからクラスBのメソッドを呼ばなくてはならないという順…
直訳すれば「責任の鎖」。受け取った処理が自分で解決できるなら解決し、解決できない場合は次へ回すという、行ってみればたらい回し。 とある処理を解決する方法が何種類かある場合、処理をリストでつなげておけば、どの処理を使うのか使う側が選択せずに、…
データ構造を持つクラスとそれに処理を行うクラスを分離する。 データのクラスに行いたい処理のメソッドを追加するのではなく、処理を行うクラスを作成し、それを受け入れるようにする。こうすることにより処理内容が変わってもデータのクラスを修正する必要…
中身と装飾を同一視して、重ねて装飾を追加していく。 Decoratorとは装飾者のことで、ケーキのデコレーションのように飾っていくこと。 ゲームで考えてみよう。 RPGでの武器に魔力が追加されたり、強さが+1とかに強化される状態を表現する。 Weapon.java 中…
容器と中身を同一視することにより、再帰的に扱えるようにする。 一番分かりやすい例としてはファイルシステムだろう。ファイルとディレクトリを共通のインタフェースを持つ親クラスから派生するようにする。そうすればディレクトリの中にさらにディレクトリ…
Strategy(戦略)、つまりプログラムならアルゴリズムを切り替える。 これは分かりやすい。ゲームに例えるなら、CPUと対戦するゲームを作った場合、CPUのクラスに思考ルーチンを組み込んでしまうのではなく、思考ルーチンを別クラスにして定義し、CPUのクラス…
機能のクラス階層と実装のクラス階層を分けて、その橋渡しをする。 またゲームで考えてみる。攻撃メソッドを持った敵クラスを作成し、それを継承してゴブリンクラスを作成。 class Enemy { public: void Attack(); }; class Goblin : public Enemy { public:…
具体的なクラスを指定せずに、インスタンスを生成することができるのがこのパターン。 例によってゲームで考えてみる。 抽象的な製品であるEnemy。 package factory; public abstract class Enemy { public abstract void Message(); } 抽象的な工場であるFa…
抽象的な工場で抽象的な部品を組み合わせて抽象的な製品を作りだすもの。 本を読んでいても、抽象的ばかりで非常にややこしい。サンプルプログラムも大きくクラスも多いので理解が大変。ゲームでの例えもまだ思いつかない。 ということで、明日に持ち越し。
複雑な構造を持ったインスタンスを組み上げる。 全体を構成する各パートをそれぞれ作り、それを順番に組み上げて全体を作成するというイメージかな。 では、ゲームで考えてみよう。 敵キャラが体力、大きさ、強さの3つのパラメータから出来ているとする。 cl…
インスタンスをコピーして別のインスタンスを作り出す。 毎回、newでクラスからインスタンスを作り出すのではなく、プロトタイプとなるインスタンスをコピーして新しいインスタンスを作り出す。 ゲームで考えてみよう。ある敵が分裂するような場合があり、そ…
インスタンスを1つしか作成しないようにする。 あるクラスを1個しかインスタンスを作らないように制限をかける。プログラマが1個しか作らないように注意してコーディングすればいいじゃんという話もあるが、自分ひとりでプログラムするならまだしも、複数人…
Template Methodパターンをインスタンス生成に適応したもの。インスタンスを生成するメソッドを抽象クラスで定義し、具体的な生成部分は子クラスに任せる。 次の例では、TestFactory(工場)を作成し、createメソッドでTest(製品)のインスタンスを作成している…
親クラスで枠組みを決めて、具体的な処理は子クラスで実装するもの。親クラスでテンプレートとなるメソッドを抽象メソッドで定義し、具体的な処理は子クラスで実装する。 アルゴリズム的な部分は一緒だけど、具体的な部分は異なるような場合、コピーペースト…
あるものに皮をかぶせて利用すること。個人的にはWrapper(ラッパー)といったほうがしっくりくる。 たとえば、ライブラリを利用する部分で、直接ライブラリの関数を呼ぶのではなく、ライブラリを使用するクラスを用意しておけば、ライブラリのメソッド名が変…
要素を1つ1つ数え上げるもの。 配列の要素を順番に処理していくようなときに使う。ループ変数のようなもの。 forループ等で直接アクセスせず、Iteratorを使うことによって、配列がリストになったりしてもソースを変更することなくアクセスできる。 Javaに…