PHPデザインパターン~オブジェクト指向でのソフトウェア開発に於ける再利用可能な設計パターン集~
- 公開日
- 更新日
- カテゴリ:DesignPatterns
- タグ:PHP,DesignPatterns

ソフトウェア開発におけるデザインパターンとは、オブジェクト指向での開発を行う際に用いられる再利用可能な設計パターンです。書籍「オブジェクト指向における再利用のためのデザインパターン」= GoF(Gang of Four)本で有名になりました。
良く使う開発・設計手法をまとめたものがデザインパターンになりますが、デザインパターンという考え方自体は建築手法をまとめたものがきっかけとなりました。書籍では C++や SmallTalk から始まり、続いて Java 版などが出版されていますが、その手法は PHP に於いても適用できます。
PHP を含め、デザインパターンに関する書籍は最近では出版されていませんが、デザインパターンはいわば先人の集合知。プログラミング言語を扱うのであれば、理解を深める為にもデザインパターンは通るべき道だと私は思います。例えば基本を通り、ある程度の知見が溜まった時にでもデザインパターンに取り組みそれを自分のものと出来た時は、また一回り成長し次の取り組むべきを見つけられる事でしょう。
ただし、デザインパターンはあくまでもロジックパターンであり、全てに通ずる万能薬ではありません。手法を自身で消化し、その上で適切な形で利用する必要があります。そういった意味でも、デザインパターンは先人の知恵という名のソフトウェア設計の根幹となっていると思います。
ちなみにデザインパターンと一口に言っても、発表されているものはたくさんあります。(例えば wikipedia に掲載があるもの)ここでは、GoF 本で紹介されている 23 パターンを取り上げます。
1. Iterator パターン
- 配列・オブジェクト等複数の値を含むコレクションに順番にアクセスする(反復処理)方法を提供する
- 振る舞いに関するデザインパターン
- サンプルソース
2. Adapter パターン
- 異なるインターフェイスを持った機能をアダプタに吸収させる形で双方の機能を取り込みつつ、新しい処理モデルを作成する
- 構造に関するデザインパターン
- サンプルソース
3. TemplateMethod パターン
- スーパークラスに共通処理や抽象メソッドを定義し、それをサブクラスらが継承する仕組みを持つ処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
4. FactoryMethod パターン
- スーパークラスに共通処理や抽象メソッドを定義し、それをサブクラスらが継承する仕組みを持つ処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
5. Singleton パターン
- インスタンスの生成を制御し、そのインスタンスが必ず1つだけである事を保証する
- 生成に関するデザインパターン
- サンプルソース
6. Prototype パターン
- インスタンスの複製に関する処理モデル。既にある型を利用して効率的にインスタンスを回していく
- 生成に関するデザインパターン
- サンプルソース
7. Builder パターン
- オブジェクト生成の流れを抽象化する(生成の手順や手段を切り離す)事で、オブジェクトの生成を柔軟にする
- 生成に関するデザインパターン
- サンプルソース
8. AbstractFactory パターン
- 関係するオブジェクト郡をまとめて生成する
- 生成に関するデザインパターン
- サンプルソース
9. Bridge パターン
- 橋渡しのクラスを定義することで、処理構造を縦割型から横断型にし、構造の効率・最適化を図る事のできる処理モデル
- 構造に関するデザインパターン
- サンプルソース
10. Strategy パターン
- 戦略部分(アルゴリズム等)をクラス単位で定義(カプセル化)する事で、その切り替えや追加・拡張を容易にする処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
11. Composite パターン
- 入れ物とその中身を同一のものと取り、再帰的な構造での取り扱いを簡単にする処理モデル
- 構造に関するデザインパターン
- サンプルソース
12. Decorator パターン
- 基となるオブジェクトとそれを装飾するオブジェクトを同一のレベルで扱えるような関係性を築く事で、より柔軟なパラメータの取り回しや機能拡張を実現できる処理モデル
- 構造に関するデザインパターン
- サンプルソース
13. Visitor パターン
- クラスの持つ役割を分離する事でそれぞれの利用・機能拡張を容易にする処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
14. ChainOfResponsibility パターン
- 同一レベルの処理クラスをチェインする(鎖状につなげる)事で、一定の規則に対応した連鎖的な処理を実現できる処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
15. Facade パターン
- サブシステムをまとめその窓口となるクラスを作成する事で、複雑な一連の処理を意識する事なくシンプルにその機能を利用できる処理モデル
- 構造に関するデザインパターン
- サンプルソース
16. Mediator パターン
- オブジェクト同士の無秩序な相互参照を一極集中型にする事で、シンプルかつメンテナビリティ(保守性)の高いインターフェイスを実現する処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
17. Observer パターン
- 状態変化を関連オブジェクトに通知し付随する処理を行う関係を築く事で、各オブジェクトの依存性を切り離し、再利用性を高める処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
18. Memento パターン
- オブジェクトの状態をスナップショットとして保存しておく事で、必要な時のその状態をリストアできる処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
19. State パターン
- ある機能の「規則」を1つのクラスとして表現し振る舞いを定義する事で、機能拡張を容易にする処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
20. Flyweight パターン
- 同一のインスタンスを再利用する事でリソースを節約する処理モデル
- 構造に関するデザインパターン
- サンプルソース
21. Proxy パターン
- 主クラスの代理クラスを同一インターフェイスで実装する事で処理を委譲し、省リソース化や処理の取り回しを調整できる処理モデル
- 構造に関するデザインパターン
- サンプルソース
22. Command パターン
- ある機能に於いて処理の対象・要求・管理の関係性を築く事で、柔軟な処理の取り回しを行える処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース
23. Interpreter パターン
- ある機能の「規則」を1つのクラスとして表現し振る舞いを定義する事で、機能拡張を容易にする処理モデル
- 振る舞いに関するデザインパターン
- サンプルソース