【コード設計】デザインパターンとは何か?
デザインパターンとは、ソフトウェアの設計時に直面しがちな問題とその典型的な解決策を整理し、様々な場面で応用・再利用できる形にまとめたものです。
デザインパターンを学ぶことで、プログラミングの効率化や品質向上、エンジニア同士のコミュニケーションなどに役立ちます。
デザインパターンには、主に以下の3つの種類があります。
生成に関するパターンは、オブジェクトの生成方法や数を制御するためのパターンです。例えば、Abstract Factory, Builder, Factory Method, Prototype, Singletonなどがあります。
構造に関するパターンは、オブジェクトやクラスの構成や関係を整理するためのパターンです。例えば、Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxyなどがあります。
振る舞いに関するパターンは、オブジェクトやクラスの振る舞いや役割を定義するためのパターンです。例えば、Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observerなどがあります。
生成に関するパターン
Abstract Factory
Abstract Factoryとは、日本語に訳すと「抽象的な工場」という意味です。Abstract Factoryパターンはインスタンスの生成を行うクラスを用意することで、整合性を必要とするオブジェクトを組み合わせて製品を作りあげるデザインパターンです。
Builder
Builderとは「建築者」という意味です。Builderパターンはあらかじめ決めた構造をベースに様々なオブジェクトを生成するためのデザインパターンです。
Factory Method
Factory Methodは、サブクラスでインスタンスの生成を行うためのデザインパターンです。サブクラスでインスタンスを生成させることで、柔軟にインスタンスを生成させることができます。
Prototype
Prototypeとは「原型」や「試作品」という意味です。その意味の通り、Prototypeパターンは原型となるインスタンスを元に、別のインスタンスを生成するデザインパターンです。
Singleton
Singletonは「一枚札」という意味です。一枚札とはトランプの1組に唯一存在するカードを表します。Singletonパターンはインスタンスが1つしか生成されないことを保証するデザインパターンです。
構造に関するパターン
Adapter
Adapterは「適合させるもの」という意味です。Adapterパターンは本来は互換性がないクラス同士を必要な形に変換して利用するためのデザインパターンです。
Bridge
Bridgeパターンは2つの場所を橋で結びつけるためのデザインパターンです。2つの場所とは「機能」と「実装」です。このデザインパターンを用いることで、機能と実装を分離することができます。
Composite
Compositeとは「混合物」という意味です。Compositeパターンは容器と中身を同一化することで再帰的な構造を作るデザインパターンです。
Decorator
Decoratorとは「装飾者」という意味です。Decoratorパターンはオブジェクトに対して継承以外で機能追加を行うデザインパターンです。
Facade
Facadeとは「正面」という意味です。Facadeパターンは処理を行うためのシンプルな「窓口」を用意するデザインパターンです。大きなプログラムで処理する場合、関係するたくさんのクラスを用意し、制御する必要があります。処理を行うための窓口を用意することで、プログラムの構造をシンプルにすることができます。
Flyweight
Flyweightとは「フライ級」という意味です。フライ級はボクシングで最軽量の階級です。Flyweightパターンはインスタンスを共有することでインスタンスの生成を抑え、メモリ消費量を少なくするデザインパターンです。
Proxy
Proxyとは「代理人」という意味です。Proxyパターンは本人に代わって代理人となるオブジェクトが代わりに処理の一部を行うデザインパターンです。
振る舞いに関するパターン
Chain of Responsibility
Chain of Responsibilityは「責任の連鎖」という意味です。Chain of Responsibilityパターンは複数のオブジェクトをチェーンでつなぎ、オブジェクトを渡り歩きながら処理を決定するデザインパターンです。
Command
Commandは「命令」という意味です。Commandパターンは処理命令自体をオブジェクトとし、引数を渡すことで処理を実行するデザインパターンです。
Interpreter
Interpreterは「解釈者」という意味です。Interpreterパターンは何らかの形式で書かれたファイルの内容を解析し、決められた手順によって処理を行うデザインパターンです。
Iterator
Iteratorは「繰り返す」という意味です。Iteratorパターンはオブジェクトの集合体に対して、順次アクセスする処理を行うためのデザインパターンです。
Mediator
Mediatorは「仲裁者」という意味です。Mediatorパターンは多数のオブジェクトを調整しながら処理を行うデザインパターンです。
Memento
Mementoは「記念品」や「形見」という意味です。Mementoパターンはカプセル化を破壊することなく状態の保存/復元を可能とするデザインパターンです。
Observer
Observerは「観察者」という意味です。Observerパターンは観察対象のオブジェクトに何か状態の変化が発生すると、観察者に通知するデザインパターンです。
State
Stateは「状態」という意味です。Stateパターンは状態の変化をクラスとして表現するデザインパターンです。
Strategy
Strategyは「戦略」という意味です。Strategyパターンはアルゴリズムを交換することで、柔軟にクラスを変更することができるデザインパターンです。
Template Method
Template Methodパターンはスーパークラスでテンプレートを用意し、サブクラスで具体的な内容を実装するデザインパターンです。Template Methodは、似たような処理を共通化したいときに、よく用いられるデザインパターンです。
Visitor
Visitorは「訪問者」という意味です。Visitorパターンはデータ構造と処理を分離するデザインパターンです。処理を実行する訪問者のクラスを用意し、データ構造を訪問して実行するイメージです。
デザインパターンについてもっと詳しく知りたい場合は、以下の書籍を参考にしてください。
『オブジェクト指向における再利用のためのデザインパターン』(GoF)
『Java言語で学ぶデザインパターン入門』(結城浩)
『Javaで学ぶデザインパターンとアーキテクチャ』(山田祥寛)