デザインパターン

GoFデザインパターンの特徴を一言で表してみる

Creational Patterns(生成に関するパターン) Abstract Factory 整合性を必要とする一連のオブジェクト群を、間違いなく生成したいとき、関連するオブジェクトをConcreteクラスを意識せずに、まとめて生成するインターフェースを提供する 【デザインパター…

【デザインパターン】Template MethodとStrategyの違い

Template methodとStrategyはともに「アルゴリズムを変更可能にする」という目的がある. Template methodとStrategyの違いとして,一般的に下記のようなことが言われている. 基本的にはTemplate methodは継承を使い,Strategyはコンポジションを使う Strat…

【デザインパターン】Visitor

どういうもの? 既存オブジェクトに対する新たな操作を、構造を変化させずに追加できる classic technique for recovering lost type information ダブルディスパッチを利用 どんなときに使う? あるクラスに機能追加するときに、構造を変化させたくないとき…

【デザインパターン】Factory Method

どんなもの? オブジェクト生成のためのインターフェースを定義する。インターフェースの実装クラスがどのクラスのオブジェクトを生成するかを決める。Factory Methodは、実装クラスに生成を延期するということ。 virtualコンストラクタを定義する どんなと…

【デザインパターン】Memento

どういうもの? あるオブジェクトの任意の時点の状態を保存しておき、後でその状態にオブジェクトを戻す 例 典型的な構成要素 Originator 自分の状態を保存したMementoを作成する 要求されたMementoに状態を戻す Memento Originatorの内部情報を保持する。 M…

【デザインパターン】Composite

どんなもの Compositeとは複合物を意味する言葉。 オブジェクトを木構造として階層全体を表現する 容器と中身を同一視する("Directories contain entries, each of which could be a directory")ことで、再帰的な構造の取り扱いを容易にする。 どんなとき…

【デザインパターン】Strategy

どんなもの? アルゴリズムをクライアントから引き離す。 同じインターフェースをもつ派生クラスにアルゴリズムを記述する Template Methodと似ているが、Template Methodは処理をサブクラスに任せるのに対して、Strategyでは処理を委譲する。 どういうとき…

【デザインパターン】Decorator

どんなもの? Decoratorは継承よりも柔軟な方法で、オブジェクトに機能を動的に追加する コアとなるオブジェクトを再帰的にラップしていく ラッパーと中身を同一視する どういうときに使う? あるクラスの機能を追加するとき クラスの使用方法を変えたくない…

【デザインパターン】Abstract Factory

どんなもの? 関連するオブジェクトをConcreteクラスを意識せずに、まとめて生成するインターフェースを提供する どういうときに使う? 整合性を必要とする一連のオブジェクト群を、間違いなく生成したいとき 例 典型的な構成要素 AbstractFactory ConcreteF…

【デザインパターン】Command

どんなもの? あるクラスへの要求をオブジェクトとしてまとめることで、様々な要求をqueueなどリスト管理することができ、Undoや履歴管理が可能となる オブジェクト指向callback どんなときに使う? あるクラスに対して,複雑な要求をしたい場合 要求のUndo…

【デザインパターン】Facade

どんなもの? サブシステムのインターフェースを一つのインターフェースにまとめる。これにより、サブシステムが使いやすくなる高次のインターフェースを定義したことになる。 複雑なサブシステムを単純なインターフェースでラップする どういうときに使う?…

【デザインパターン】Mediator

どんなもの? 複雑に絡みあった複数のオブジェクト間の関係を、必ず仲介者を介して処理を行うようにすることで、単純かつ明快なインターフェースを提供する。 管轄下にある複数のオブジェクトから問い合わせをうけ、判断を行い、管轄下のオブジェクトへ指示…

【デザインパターン】Flyweight

どういうもの? 一つ一つは小さいオブジェクトを大量に利用する際に、生成済みのオブジェクトできるだけ再利用する 無駄なオブジェクトによるメモリ消費を抑えられる。 使用する側はそんな事情を意識せずに使える。 どんなときに使う? 再利用対象のクラスが…

【デザインパターン】Proxy

どんなもの? 別のクラスのオブジェクトがアクセスできるように代理のクラスを提供する 代理のクラスでは、ラップもしくは委譲する どんなときに使う? クラスのある一部の機能のみを実体化して使用したいとき 例 典型的な構成要素 Subject RealSubject Prox…

【デザインパターン】Chain of Responsibility

どんなもの? 一つ以上のオブジェクトに要求を処理する機会を与えることで、要求の送り手と受け取り手を疎結合にする 受け取り手を繋いで、その連結順に要求を受け渡していく 要求を処理するオブジェクトを意識しないで、要求を送ることができる どんなとき…

【デザインパターン】Bridge

どんなもの? あるクラスにおける機能追加と機能実装の2つの継承を分離し、それらを独立して管理する 機能追加のための継承: スーパークラスが持っていない機能をサブクラスで追加する 機能実装のための継承: スーパークラスで定義したインターフェースでサ…

【デザインパターン】Singleton

どんなもの? あるクラスのインスタンスが一つしかないことを保証する 必要とされたときに初めて初期化される(just-in-time initialization)もしくは初めて使うときに初期化される(initialization on first use) どんなときに使う? ある一つのアプリに対し…

【デザインパターン】Prototype

どんなもの? 一度作成したインスタンスをデータベースに記憶しておく それらを適宜呼び出して、全てのインスタンスの生成元として使う どんなときに使う? 標準的なnewなどの方法で新しいオブジェクトを作ることによるコストが高い時。 たとえば何種類もの…

【デザインパターン】State

どんなもの? 状態が変わったときに、オブジェクトの振る舞いが変わるようにする。 それぞれの状態をクラスで表現する。 状態を持つクラスは、それぞれの状態クラスを抽象クラスの形で保持する。 オブジェクト指向ステートマシン Wrapper + polymorphic wrap…

【デザインパターン】Builder

どんなもの? あるオブジェクトの建築過程(construction process)と表現方法(representation)を分離することで、柔軟に変更できるソフトを目指す どんなときに使う? 複雑なオブジェクトを複数種類作成したいとき 例 典型的な構成要素 Director ConcreteBuil…

【デザインパターン】Adapter

どんなもの? あるクラスのインターフェースを、別のインターフェースへ変換する。アダプターはもともと適合しなかったインターフェースをもつ複数のクラス同士を協働させる。 既存クラスを新しいインターフェースでラップする Impedance match an old compo…

【デザインパターン】Template Method

どんなもの? 処理の手順を基本クラスに定義しておく。 (Placeholdersを宣言する) その中の派生クラスによって差異部分となる処理を派生クラスで実装する。 (Placeholdersを実装する) どんなときに使う? 大まかな処理が共通で、アルゴリズムの具体的な…

【デザインパターン】Observer

どんなもの? 一つのオブジェクトの状態が変わったら、依存関係にあるオブジェクトへ通知される MVCの中のViewに相当する どういうときに使う? 観測対象のオブジェクトの状態が変わったときに、通知されたいとき 例 典型的な構成要素 Subject Observer コー…