3行でいうと
- 熟練者が繰り返し使う設計の型を、23個のパターンに整理した
- 「インターフェースに対してプログラミングする」が核になる原則
- 「継承よりコンポジション(部品の組み合わせ)」も核になる原則
向いている人
オブジェクト指向の基本を理解したうえで、設計の考え方と共通語彙を身につけたい開発者に向きます。
読む意味
設計レビューやコードレビューで通じる語彙を学べます。多くの現代の言語やライブラリの内部設計にも、これらのパターンが組み込まれています。
読むときの注意
主な題材は静的型付け言語のC++で、後発の言語機能により必要性が薄れたパターンもあります。Singletonなどは誤用への批判も多く、著者の一人も見直したい意向を述べています。
どんな本か
熟練したオブジェクト指向の設計者が繰り返し使ってきた「良い設計の型」を、23個のパターンとして初めて体系的にまとめた古典です。4人の著者は「Gang of Four(GoF)」と呼ばれ、本書も「GoF本」の通称で知られています。原著は1994年の刊行です。パターンという発想は、建築家クリストファー・アレグザンダーの『パタン・ランゲージ』に着想を得ています。
全6章のうち、第1章でパターンの定義とカタログの読み方を示し、第2章でドキュメントエディタ「Lexi」の設計を例に、複数のパターンを組み合わせる様子を見せます。第3〜5章がカタログで、パターンを「生成」「構造」「振る舞い」の3つに分けて、5種・7種・11種を収めます。各パターンは、目的、動機、構造、結果(トレードオフ)、サンプルコードなど、統一した形式で記述されます。サンプルコードは主にC++で、一部Smalltalkです。
本書の核心は、パターンの暗記よりも、変化しやすい部分を切り分けて、柔軟さと再利用しやすさを高める設計原則にあります。パターンの名前が、設計について話すための共通語彙になったことも大きな意義です。一方で、刊行から年数がたち、後の言語機能によって不要になったパターンもあるとされ、機械的に当てはめず、変化する点とトレードオフを見極めて使うことが求められます。
中身の柱
- パターンとは何か、カタログの読み方
- ドキュメントエディタ「Lexi」の設計を例にした事例研究
- 生成に関するパターン(Factory Method、Singletonなど5種)
- 構造に関するパターン(Adapter、Composite、Decoratorなど7種)
- 振る舞いに関するパターン(Observer、Strategy、Commandなど11種)
- パターン同士の関係と、今後の設計への展望
あわせて読む本
- リファクタリング設計を保ちつつコードを改善する手法で、本書の後続
書評データベースの全文を読む
概要
熟練したオブジェクト指向設計者が繰り返し用いてきた「良い設計の型」を23個のパターンとして初めて体系的にカタログ化した古典。著者4名(エーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディース)の頭文字ではなく、匿名の総称として「Gang of Four(GoF)」と呼ばれるようになり、本書自体も「GoF本」の通称で世界中のエンジニアに参照され続けている。本書の着想は、1990年のOOPSLA会議で開かれた「アーキテクチャ・ハンドブックに向けて」と題するバーズ・オブ・ア・フェザー(自由討議)セッションで、ガンマとヘルムが共通の関心を発見したことに端を発するとされ、後にジョンソンとブリシディースが加わり4人の共同作業として書籍化が進められた。原著は1994年10月にAddison-Wesleyより刊行され(全395ページ)、日本では『オブジェクト指向における再利用のためのデザインパターン』としてSBクリエイティブ(旧ソフトバンク)から翻訳出版された。刊行から現在までに英語版だけで50万部以上、他の13言語への翻訳版を含めると世界で広く読まれ続けている。4名の著者は2005年、プログラミング言語・プログラミング実践への貢献を称えるACM SIGPLANプログラミング言語功労賞を受賞している。本書の核心は個々のパターンの列挙そのものよりも、「インターフェースに対してプログラミングし、実装に対して行わない」「継承よりもオブジェクトコンポジションを優先する」という2つの設計原則にある。各パターンはこれらの原則を具体的な形で体現したものであり、変化しやすい部分を特定してカプセル化することで、システムの柔軟性と再利用性を高める方法を示している。ソフトウェア設計における共通言語(vocabulary)を確立した点でも歴史的意義が大きく、後続のリファクタリング論やアジャイル設計論、UMLモデリングの発展にも直接的な影響を与えた。なお「パターン」という概念自体は、本書に先立って建築家クリストファー・アレグザンダーが著書『パタン・ランゲージ』(1977年)で提示した、繰り返し現れる問題に対する再利用可能な設計解を記述する手法に着想を得たものであり、ソフトウェア工学の文脈にこの考え方を持ち込んだ点も本書の歴史的な貢献として位置づけられている。
本の構成
全6章構成。第1章「デザインパターンとは」でパターンの定義とカタログの読み方を提示し、第2章では実際のドキュメントエディタ「Lexi」の設計を題材にしたケーススタディを通じて、複数のパターンがどのように組み合わされて実務上の問題を解決するかを具体的に示す。続く第3章から第5章が本書の中核であるパターンカタログであり、パターンを「生成に関するパターン(Creational Patterns)」「構造に関するパターン(Structural Patterns)」「振る舞いに関するパターン(Behavioral Patterns)」の3分類・全23種類に整理して収録している。第3章の生成に関するパターンは5種(Abstract Factory、Builder、Factory Method、Prototype、Singleton)、第4章の構造に関するパターンは7種(Adapter、Bridge、Composite、Decorator、Facade、Flyweight、Proxy)、第5章の振る舞いに関するパターンは11種(Chain of Responsibility、Command、Interpreter、Iterator、Mediator、Memento、Observer、State、Strategy、Template Method、Visitor)で構成される。第6章では全体を振り返り、パターン間の関係性や今後の設計思想への展望を論じている。各パターンの記述は「目的」「動機」「適用可能性」「構造(UML図)」「構成要素」「協調関係」「結果(トレードオフ)」「実装」「サンプルコード」「既知の用例」「関連するパターン」という統一フォーマットに従っており、この形式自体がのちのパターン記述の標準となった。サンプルコードはC++を中心に、一部Smalltalkでも示されている。
主要な内容
生成に関するパターンは、オブジェクトの生成過程をクライアントコードから切り離すことを目的とする。Factory Methodはサブクラスにインスタンス生成を委譲し、Abstract Factoryは関連するオブジェクト群をファミリー単位で生成するインターフェースを提供する。Builderは複雑なオブジェクトの構築手順を段階的に分離し、Prototypeは既存インスタンスをコピーして新しいオブジェクトを作る。Singletonはクラスのインスタンスを唯一に制限しグローバルなアクセス点を提供するが、後年テスト容易性やグローバル状態の問題から最も批判の対象になったパターンでもあり、著者の一人ガンマ自身も2009年の対談で、もし本書を書き直すならSingletonは削除したいと語ったことが知られている。構造に関するパターンはクラスやオブジェクトの組み合わせ方に関するもので、Adapterは互換性のないインターフェースを変換し、Compositeは個々のオブジェクトと集合を同一のインターフェースで扱えるようにして木構造を表現し、Decoratorは継承を使わずに責務を動的に追加する。Facadeはサブシステムへの単純化された窓口を提供し、Proxyは他のオブジェクトへのアクセスを制御する代理オブジェクトを置く。振る舞いに関するパターンはオブジェクト間の責務分配とアルゴリズムの委譲を扱う。Observerは状態変化を依存オブジェクトへ自動的に通知する仕組みで、後のMVCアーキテクチャやイベント駆動プログラミングの基礎となった。Strategyはアルゴリズムをカプセル化して交換可能にし、Template Methodはアルゴリズムの骨格を親クラスで定め、詳細な手順をサブクラスに委ねる。Stateはオブジェクトの内部状態に応じて振る舞いを切り替え、Commandは要求をオブジェクトとしてカプセル化することで、要求のキューイングやログ記録、取り消し(Undo)操作を可能にする。Visitorはデータ構造とその上で行う操作を分離し、新しい操作の追加を既存クラスの変更なしに実現する。批評家のポール・グレアムは、自身のプログラムの中にデザインパターンの存在を見出したときは「トラブルの兆候」とみなすと述べ、ピーター・ノーヴィグも、23パターンのうち16パターンはLispやDylanのような言語機能(第一級関数やマクロなど)によってより単純に実現できると分析しており、GoFパターンの多くが特定の静的型付け言語の表現力の不足を補うためのイディオムであるという批判的な観点も広く知られている。
具体例
第2章のLexiドキュメントエディタのケーススタディでは、実際に複数パターンがどのように組み合わさるかが示される。文書内の文字・図・表を一様に扱うためにCompositeパターンで木構造を構築し、行の折り返しアルゴリズムをCompositeとは独立に差し替え可能にするためStrategyパターンを適用する。ウィンドウシステムの違い(当時のMacintoshやPMのウィンドウ管理の差異)を吸収するためにAbstract FactoryとBridgeを組み合わせ、GUI要素の見た目のカスタマイズにはDecoratorを、複数の描画表現の切り替えにはStrategyを用いる。また、ユーザーの操作履歴を管理してUndo機能を実現するためにCommandパターンが使われ、書式変更などの状態変化を他のUIコンポーネントへ伝播させるためにObserverが利用される。これらの例は、単一のパターンだけでなく、複数のパターンが協調して一つの実用的なソフトウェアの設計課題を解決する様子を具体的なコード(C++、一部Smalltalk)とともに示している。既知の用例としても、当時のInterViewsやET++、Unidrawといったオブジェクト指向フレームワークにおける各パターンの実装例が具体的に紹介されており、本書のパターンが理論上の抽象概念ではなく、実際に稼働していたソフトウェア資産の分析から抽出されたものであることを裏づけている。
実践への応用
本書のパターンは、Java(JDKのIteratorやObserver、AbstractFactory的なファクトリクラス群)、C#、GUIフレームワーク(Java Swing、.NET WinForms)、フレームワーク設計(Springの依存性注入とFactory、テンプレートメソッドを用いたライフサイクル制御)など、現代の主要言語・ライブラリの内部設計に深く組み込まれている。エンジニアのコミュニケーションにおいても、「ここはStrategyで切り替え可能にしよう」「Observerで通知すればよい」といった共通語彙として機能し、設計レビューやコードレビューの効率を高める。一方で、動的型付け言語や関数を第一級オブジェクトとして扱える言語(Python、JavaScript、Rubyなど)では、Strategyパターンが単に関数の受け渡しで実現できたり、Singletonがモジュールレベルの単一インスタンスで代替できたりするなど、GoFパターンの多くが言語機能の不足を補うためのイディオムであるという指摘もある。したがって実務では、パターンを機械的に適用するのではなく、変化点の見極めとトレードオフの理解を伴った上で採用することが求められる。
位置づけ・評価
本書はソフトウェア工学史において、オブジェクト指向設計の実践知を初めて系統立てて言語化した画期的な著作として位置づけられている。1990年代後半から2000年代にかけて「デザインパターンブーム」を巻き起こし、Martin FowlerのリファクタリングやTest-Driven Developmentの議論、UMLモデリング標準の普及、さらにはPatterns of Enterprise Application Architectureなど後続の設計パターン書籍群にも直接的な影響を与えた。一方で刊行から30年近くが経過し、静的型付け言語のC++を主な題材としていることや、ラムダ式・高階関数・ミックスインなど後発の言語機能によって一部パターンの必要性が薄れているという指摘、Singletonをはじめとするパターンの誤用・濫用に対する批判も多く出ている。著者自身も2009年の座談会で、パターンの分類の一部を見直したい、あるいは新たなパターンを追加したいという考えを示しつつも、具体的な改訂には至らなかった経緯がある。それでもなお、23パターンの名称と概念はソフトウェア業界全体で共有される基礎知識として定着しており、設計原則(インターフェース志向、コンポジション優先)を学ぶ入門書としての価値は現在も色褪せていない。