RitoLabo

PHPデザインパターン~オブジェクト指向でのソフトウェア開発に於ける再利用可能な設計パターン集~

  • 公開:
  • カテゴリ: 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つのクラスとして表現し振る舞いを定義する事で、機能拡張を容易にする処理モデル
  • 振る舞いに関するデザインパターン
  • サンプルソース