1075 文字
5 分
【設計】デザインパターン【一覧】
デザインパターンについて
デザインパターンとは、ソフトウェア設計における頻出する問題を解決するための汎用的な設計テンプレートのこと。 オブジェクト指向設計において、オブジェクトの生成・構造・振る舞いに関する課題を体系的に整理し、再利用可能な形でまとめたものです。
デザインパターンは、具体的なコードの実装を示すものではなく、設計の指針として機能します。これにより、コードの可読性や保守性が向上し、開発者間での共通認識を持ちやすくなります。
代表的であるGoF(Gang of Four)のデザインパターンは23種類あり、「生成」「構造」「振る舞い」 の3つのカテゴリに分類されます。
1. 生成パターン(Creational Patterns)
オブジェクトの生成方法を管理し、効率的なインスタンス生成を実現する。
パターン名 | 概要 | 使いどころ | メリット |
---|---|---|---|
Factory Method | サブクラスがインスタンス生成を決定する | 具体的なクラスを意識せずにオブジェクトを作りたい | カプセル化、拡張性向上 |
Abstract Factory | 関連するオブジェクト群を一括で生成 | UIフレームワークなど、関連オブジェクトをまとめて作る | 依存関係を減らせる |
Singleton | 1つのクラスのインスタンスが常に1つだけ | 設定管理、ログ管理など | インスタンス共有、メモリ節約 |
Builder | 複雑なオブジェクトを段階的に組み立てる | オプションの多いオブジェクトの生成 | 可読性向上、柔軟な生成 |
Prototype | 既存のオブジェクトをコピーして新しいインスタンスを作る | オブジェクトの生成コストを抑えたい場合 | 高速なインスタンス生成 |
2. 構造パターン(Structural Patterns)
オブジェクトやクラスの関係を整理し、柔軟な構造を実現する。
パターン名 | 概要 | 使いどころ | メリット |
---|---|---|---|
Adapter | 既存のクラスを異なるインターフェースで使えるようにする | 互換性のないAPIを統一する | 既存コードを変更せずに再利用 |
Bridge | 抽象部分と実装部分を分離し、それぞれ独立して拡張可能にする | UIテーマの切り替えなど | 柔軟な拡張 |
Composite | 木構造を使い、個別オブジェクトとグループを統一的に扱う | ファイルシステム、GUIコンポーネント | 再帰的な構造を簡単に実装 |
Decorator | オブジェクトの機能を動的に追加する | I/Oストリーム、ログの拡張など | 柔軟な機能追加 |
Facade | 複雑なシステムにシンプルなインターフェースを提供する | 外部ライブラリの利用時 | シンプルなAPI設計 |
Flyweight | 共通データを共有し、メモリ使用量を削減する | 文字フォントやゲームのスプライト管理 | メモリ節約 |
Proxy | 代理オブジェクトを介してアクセス制御や遅延処理を行う | リモートオブジェクト、キャッシュ管理 | アクセス制御、リソース管理 |
3. 振る舞いパターン(Behavioral Patterns)
オブジェクトのやり取りや、責務の分担を整理する。
パターン名 | 概要 | 使いどころ | メリット |
---|---|---|---|
Chain of Responsibility | リクエストを処理できるオブジェクトに順番に渡す | ログ処理、認証、フィルター | 柔軟なリクエスト処理 |
Command | リクエストをオブジェクトとしてカプセル化する | Undo/Redo機能、バッチ処理 | 処理の分離、履歴管理 |
Interpreter | 独自言語の構文解析を実装する | SQLパーサー、スクリプトエンジン | 柔軟な言語解析 |
Iterator | 集合オブジェクトをシーケンシャルに操作できるようにする | コレクションのループ処理 | 一貫したインターフェース提供 |
Mediator | オブジェクト間のやり取りを中央で管理する | チャットアプリのメッセージ仲介 | 依存関係の低減 |
Memento | オブジェクトの状態を保存・復元する | Undo/Redo機能 | 履歴管理が簡単になる |
Observer | 1つのオブジェクトの状態変化を複数のオブジェクトに通知する | イベントリスナー、通知機能 | 疎結合、リアルタイム更新 |
State | 状態によって振る舞いを変える | ゲームキャラクターの状態管理 | 状態管理が明確になる |
Strategy | 振る舞い(アルゴリズム)を外部から切り替え可能にする | ソートアルゴリズム、認証方式 | 柔軟なアルゴリズム変更 |
Template Method | 基本的な処理の流れを決め、詳細はサブクラスで実装する | フレームワーク、ワークフロー管理 | コードの再利用性向上 |
Visitor | オブジェクトの構造を変更せずに新しい処理を追加する | コンパイラの構文解析、ファイル構造の走査 | 柔軟な処理の追加 |
まとめ
- 生成パターン → オブジェクトの作り方を整理(Singleton, Factory, Builder など)
- 構造パターン → クラスやオブジェクトの関係を整理(Adapter, Decorator, Proxy など)
- 振る舞いパターン → オブジェクトのやり取りや処理の流れを整理(Observer, Strategy, Command など)
【設計】デザインパターン【一覧】
https://oooo-o0.github.io/posts/designpattern/