Gang Of Fourデザインパターンを学ぶメリット

Gang of Fourのデザインパターンとは、「よく見かける機能要件(解決したい問題)」と「各機能要件に対応する設計方針」を23種類に整理したものです。例えば、「単一リソースにアクセスする場合はSingletonデザインパターンが良い」というように、機能要件に適した設計(デザインパターン)を提案しています。

デザインパターンの初出は1995年であり、その有用性がある程度理解されてきたので、オブジェクト指向による設計での基礎知識となりつつあります。デザインパターンが最善の設計方法ではない事もありますが、それを理由にデザインパターンを学習しないのは早計です。

個人的には、デザインパターンを学ぶと、以下のメリットが得られると考えています(デメリットも併記)

デザインパターンを学んでおくメリット

  • 設計に関する引き出しの増加
  • チームで設計検討する際のボキャブラリー(設計に対する共通認識)の増加
  • オレオレ設計(不適切な設計)を採用してしまう機会の減少
  • 機能追加時、デザインパターンを適用したコードは修正範囲が小規模になりやすい

デザインパターンのデメリット

  • デザインパターンの適用が必ず正しいと盲信してしまう事
  • デザインパターンが不要なケースに対して、デザインパターンを適用してしまう事
    • 例:後述するCommandパターンは、ラムダ式で同じ目的を達成可能

本記事では、JavaやRubyを用いて、各デザインパターンのクラス図と実装例を紹介した記事へのリンクを示します。リンク先がない項目は、記事を作成次第、下表を更新していきます。

また、本記事の最後でデザインパターンに関する参考書籍を紹介します。

オブジェクトの生成に関するデザインパターン

名称説明
Abstract Factory依存しあうクラス群を生成する処理を集約化し、複数クラスの再利用性が向上します
Builderインスタンスの生成過程を隠蔽し、複雑な構造を持つインスタンスの生成が容易になります
Factory Methodインスタンスの生成をサブクラスに任せる事によって、クラスの再利用性が向上します
Prototype雛形となるインスタンスを用意し、一部のフィールドだけ異なるインスタンスの生成が容易にします
Singletonあるクラスのインスタンスが一つしか生成できない状態にし、リソース等の競合を防止します

プログラムの構造に関するデザインパターン

名称説明
Adapter既存クラスを修正せずに、そのクラスのインターフェースを別のインターフェースに変換します
Bridge機能(サービス)と実装を階層分けし、それぞれの階層を独立して拡張できる状態にします
Composite木構造を伴う再帰的なデータ構造を表現します
Decorator既存クラスを修正せずに、別クラスで既存クラスをラッピングする事によって機能追加します
Facade複数の処理をまとめるクラスを作成し、サブシステムの独立性を高めます
Flvweight一度生成したインスタンスを共有し、再利用する事によって、処理スピードを改善します
Proxy本人が実施しなくてよい処理を代理人に実行させ、処理スピードを改善します

 オブジェクトの振る舞いに関するデザインパターン

名称説明
Chain Of Responsibility「依頼側」と「受信側」の結合を緩める事によって、クラスの再利用性が向上します
Command複数の異なる操作に対応するコマンドクラスを用意し、新しい操作の追加を容易にさせます
Interpreter構文解析のための文法規則を定め、特定の文法を動的に解析します
Iterator複数の要素を管理するクラスの全ての要素に対して、順次アクセスする方法を提供します
Mediator仲介者を通して各クラスを操作する事によって、クラス同士の結合度を下げます
Mementoデータ構造に対する操作を記録し、以前の状態に復帰もしくは操作再現を行います
Observerインスタンスの変化を他のインスタンスから監視可能にします
Stateインスタンスの状態を変化させる事によって、処理内容を変化させます
Strategyデータ構造に適用するアルゴリズムを隠蔽し、アルゴリズムの切替を容易化します
Template Methodアルゴリズムに含まれる処理の一部を抽象メソッドとし、実装を切替可能にします
Visitor「データ構造を保持するクラス」と「データ構造を処理するクラス」を分離します

デザインパターンに関する書籍 

書籍名コメント
増補改訂版Java言語で学ぶデザインパターン入門Javaにおける定番書籍。やや古い(2004年出版)
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編本記事で取り扱っていないマルチスレッドのデザインパターン。 マルチスレッド自体の難易度は高いが、本書は分かりやすい。
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本やりがちな失敗例とデザインパターン適用例を比較しています。 言語はJava
【知らないと損をする】レベルアップJava~デザインパターン編~安価。約500円で購入でき、内容はシッカリとまとまっています
RubyによるデザインパターンJavaと比較すると、シンプルに実装できるRubyの魅力に気づけます