概要

GoFデザインパターン

GoFデザインパターンは、1994年にErich Gamma、Richard Helm、Ralph Johnson、John Vlissidesの4人(通称「Gang of Four」)によって著された『Design Patterns: Elements of Reusable Object-Oriented Software』で提唱された、オブジェクト指向ソフトウェア設計における23の再利用可能な解決策です。生成パターン、構造パターン、振る舞いパターンの3カテゴリに分類され、ソフトウェアの再利用性、保守性、拡張性を向上させるために広く使用されています。

デザインパターン GoF オブジェクト指向 ソフトウェア設計 プログラミング
コード スラッグ 名称 概要 カテゴリ
C01 factory-method ファクトリーメソッド オブジェクト生成のインターフェースを定義し、具体的なクラスはサブクラスに決定させます。 生成パターン
C02 abstract-factory 抽象ファクトリ 関連するオブジェクト群を具体的なクラスを指定せずに生成するインターフェースを提供します。 生成パターン
C03 singleton シングルトン クラスのインスタンスを1つだけに制限し、グローバルなアクセスポイントを提供します。 生成パターン
C04 prototype プロトタイプ 既存のオブジェクトをコピーして新しいオブジェクトを生成します。 生成パターン
C05 builder ビルダー 複雑なオブジェクトを段階的に構築し、構築と表現を分離します。 生成パターン
S01 adapter アダプター 互換性のないインターフェースを持つクラス同士を連携させます。 構造パターン
S02 bridge ブリッジ 抽象部分と実装部分を分離し、それぞれを独立して変更可能にします。 構造パターン
S03 composite コンポジット ツリー構造でオブジェクトを表現し、個別とグループを同一視します。 構造パターン
S04 decorator デコレーター 既存オブジェクトに新しい機能を動的に追加します。 構造パターン
S05 facade ファサード 複雑なサブシステムに対して簡素化されたインターフェースを提供します。 構造パターン
S06 flyweight フライウェイト 共有可能なインスタンスを共有し、メモリ使用量を削減します。 構造パターン
S07 proxy プロキシ 別オブジェクトへのアクセスを制御する代理オブジェクトを提供します。 構造パターン
B01 chain-of-responsibility 責任の連鎖 リクエストを複数のハンドラに連鎖的に渡し、処理できるハンドラが処理します。 振る舞いパターン
B02 command コマンド リクエストをオブジェクトとしてカプセル化し、送信者と受信者を分離します。 振る舞いパターン
B03 interpreter インタープリター 特定の言語の文法を解析し、式を解釈・評価します。 振る舞いパターン
B04 iterator イテレーター 集合体内の要素に順番にアクセスする方法を提供します。 振る舞いパターン
B05 mediator メディエーター オブジェクト間の通信を中央の媒介者で管理し、依存関係を削減します。 振る舞いパターン
B06 memento メメント オブジェクトの状態を保存し、後で復元可能にします。 振る舞いパターン
B07 observer オブザーバー 状態変更時に依存オブジェクトに自動的に通知します。 振る舞いパターン
B08 state ステート 状態に応じてオブジェクトの振る舞いを動的に変更します。 振る舞いパターン
B09 strategy ストラテジー アルゴリズムをカプセル化し、実行時に選択可能にします。 振る舞いパターン
B10 template-method テンプレートメソッド 処理の枠組みを定義し、詳細をサブクラスに委任します。 振る舞いパターン
B11 visitor ビジター オブジェクト構造を変更せずに新しい操作を追加します。 振る舞いパターン

GoFデザインパターンは、1994年にErich Gamma、Richard Helm、Ralph Johnson、John Vlissidesの4人の著者によって発表された「Design Patterns: Elements of Reusable Object-Oriented Software」という書籍で提唱されました。この4人は「Gang of Four(四人組)」と呼ばれ、オブジェクト指向プログラミングにおける設計の問題を解決するための23のパターンを体系化しました。

これらのパターンは生成パターン、構造パターン、振る舞いパターンの3つのカテゴリに分類されています。生成パターンはオブジェクトの生成に関する問題を、構造パターンはクラスやオブジェクトの構成に関する問題を、振る舞いパターンはオブジェクト間の通信と責任分担に関する問題を解決します。それぞれのカテゴリはソフトウェア開発において異なる側面の課題に対処します。

デザインパターンを適切に使用することで、開発者は既存の検証済みの解決策を再利用でき、コードの可読性と保守性が向上します。また、共通の語彙を持つことで、チームメンバー間のコミュニケーションも円滑になります。ただし、パターンの適用は状況に応じて判断する必要があり、過度な使用は逆に複雑性を増大させる可能性があるため、適切な場面での選択的な適用が重要です。

現在でもGoFデザインパターンは、Java、C++、Python、C#など様々なプログラミング言語で広く使用されており、フレームワークやライブラリの設計にも深く組み込まれています。現代のソフトウェア開発において、これらのパターンを理解することは、優れた設計スキルを身につける上で不可欠な要素となっています。