3分でわかるデザインパターン入門(GoF)


はじめに

  • 『PHPによるデザインパターン入門(秀和システム出版)』という本の読書メモです。
  • 本で紹介されているオブジェクト指向による設計(デザインパターン)の基本GoF全23パターンのまとめのまとめ。
  • 具体的例が分かりやすく且つ実用的なので、読んだことないオブジェクト指向初心者は一度目を通すと良いかもです。

GoF 全23パターン

ちなみにGoF(Gang of Four)とはこのデザインパターンを作成した4人組のこと。(花男のF4みたい...)
難易度と実用度は独断偏見です。本には書かれていません。

難易度:
★    理解しやすい
★★   少し複雑だけどちゃんと読めば理解できる
★★★  ちゃんと読んだけどいまいち理解できなかった

実用度:
★    使うのかなコレ
★★   知っておいたら役に立ちそう
★★★  よく使っている・使えそう

1.Template Method

難易度:★
実用度:★★★
処理の一部をサブクラスで実装。よくある継承。

2.Singleton

難易度:★
実用度:★★
生成するオブジェクトの数を制限する。

3.Adapter

難易度:★
実用度:★★★
APIの異なるクラス同士をつなぎ合わせる。継承と移譲の2通りのやり方があるが、基本どちらもAdapterメソッド内でつなぎ合わせ先のメソッドを呼ぶ形になる。

4.Factory Method

難易度:★
実用度:★★★
クラスの処理(例:csv,xmlファイルを読み込む)とどのクラスを呼ぶか決める。流れは同じだけど、処理(例:それぞれのファイルの読み込み方)がものによって別のものに使える。

5.Facade

難易度:★
実用度:★★★
ファサード。仏語で窓口。クラス同士の複雑な関係を意識しなくていいように、窓口を一つ与える。

6.Iterator

難易度:★★★
実用度:★★
不規則な多次元配列でも、内部構造を意識せずにそれぞれの要素にアクセスできる。
phpならSPLの機能のIteratorインターフェース等を継承させる。

7.Abstract Factory

難易度:★★
実用度:★★★
例えば扱うデータがDBかMOCKか最初に宣言すれば、あとは芋づる式にそれぞれの処理のクラスが使われるようになる。

8.Bridge

難易度:★★
実用度:★★★
機能(例:ボタンを押す)と実装(例:押したらクイックソートされる)を分ける。
インターフェースが利用者に提供するAPIを定義することで機能と実装の橋渡しがされる。

9.Builder

難易度:★
実用度:★★★
異なる材料(例:読み込ませるファイル)だが同じ手順(open,read,close)でオブジェクトを生成させる。

10.Chain of Responsibility

難易度:★★
実用度:★★★
よくやるフォームのバリデーションみたいな。オブジェクト同士の結びつきを緩める。

11.Command

難易度:★★
実用度:★★
要求に対する受付と処理を切り離して実装できる。またクラスに実装したコマンド結果を保持させているので、UndoやRedoもできる。

12.Composite

難易度:★★
実用度:★★
木構造を表す。単一のオブジェクトとオブジェクトの集合体を混ぜてアクセス方法を同じに。(例:組織とそれに属する社員を表示させる。)

13.Decorator

難易度:★★
実用度:★
基本となるものに様々な機能を付け加えていく。追加する側のクラスが、される側のクラスのインスタンスを保持しているため、ユーザー側は追加機能が加えられていようがいなくまいが同一視して扱える。(例:入力した文字を加工し表示する)

14.Flyweight

難易度:★
実用度:★★★
一度インスタンス化したオブジェクトを、生成時に読み込んだ内容を保持させることでオブジェクトを使い回す。生成されるオブジェクトの時間やリソースが抑えられる。ただし、使い回して良いオブジェクトは環境によって変化しないものに限る。

15.Interpreter

難易度:★★
実用度:★
字句解析(文字列を意味ある字句に分解)と構文解析(分解した字句それぞれが文法に従っているかチェック)を行った構文木を処理するパターン。ミニ言語とか作れてしまう。

16.Mediator

難易度:★★★
実用度:★
オブジェクト同士の依存や関係を把握・仲介してくれるもの(例:ユーザーとチャットルームの管理)

17.Mement(Snapshot)

難易度:★★★
実用度:★
ある時点でのオブジェクトの中身を記憶し、あとで思い出せるようにする。

18.Observer

難易度:★★
実用度:★★
あるオブジェクトの状態が変化した時に、関係する他のすべてのオブジェクトに通知とそれに応じた処理を行わせる。

19.Prototype

難易度:★
実用度:★★
インスタンスをコピーして新しいインスタンスを生成する。深いコピーと浅いコピー(中身のオブジェクトも複製するか否か)がある。

20.Proxy

難易度:★★
実用度:★★
身代わりとなるオブジェクトを通じて、目的のオブジェクトにアクセスさせる。

21.State

難易度:★
実用度:★★
状態をクラスで表し、状態ごとに振る舞いを切り替えられるようにする。

22.Strategy

難易度:★★
実用度:★★
パターンごとの処理のクラスを用意。それにアクセスするための処理を書いたクラスを用意。

23.Visitor

難易度:★★★
実用度:★
データ構造とそれに対する処理(操作がデータ構造を渡り歩く)を別々にする。

おわりに

思い出すきっかけになれば。