こんにちは。
プログラミングを勉強する中で、「デザインパターン」という言葉を聞いたことがある人は多いのではないでしょうか?しかし、一言で「デザインパターン」と言っても、その内容を理解し、使っている人は少ないようです。
この記事では、最も有名なGoFデザインパターンを紹介しながら、デザインパターンとは何かを紹介します。
目次
プログラミング デザインパターンとは何か?
デザインパターンとは、一言で言うと「オブジェクト指向プログラミングにおける設計のパターン」です。デザインパターンにはいくつかあるのですが、最も有名なものは「GoF(Gang of Four)」です。これは、「オブジェクト指向における再利用のためのデザインパターン」の著者4人(エーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディース)がその著書の中で23種類のデザインパターンを紹介したものです。
4人がこの本でデザインパターンを提示した目的は、主に以下の3つです。
- 蓄積したノウハウを使用できるようにする
- 保守性や再利用性の高いソフトウェアを作成する
- ソフトウェア設計におけるエンジニア同士の共通認識とする
デザインパターンを知ることで、オブジェクト指向プログラミング、特に「継承」「コンポジション」、「ポリモフィズム」の構造を理解しやすくなります。
プログラミング デザインパターンの種類
ここでは、デザインパターンで有名な「GoF」のデザインパターンを紹介します。
生成に関するパターン
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パターンはデータ構造と処理を分離するデザインパターンです。処理を実行する訪問者のクラスを用意し、データ構造を訪問して実行するイメージです。
プログラミング デザインパターンの勉強におすすめの本
ここでは、デザインパターンの勉強にオススメの本を紹介します。
オブジェクト指向における再利用のためのデザインパターン
オブジェクト指向プログラミングにおいて、デザインパターンのバイブルの存在となる本です。JavaプログラミングでGoFの23種類のデザインパターンを紹介しています。414ページとボリュームがありますが、オブジェクト指向プログラミングにおいて、プログラミング設計のベースとなる考え方がまとめられているため、プログラミングスキルアップに役立つ本です。
増補改訂版Java言語で学ぶデザインパターン入門
JavaプログラミングでGoFの23種類のデザインパターンを紹介した本です。説明が丁寧のため、初心者でも分かりやすいのが特徴です。初めてデザインパターンに触れるのであれば、おすすめの本です。
まとめ
この記事では、最も有名なGoFデザインパターンを紹介しながら、デザインパターンとは何かを紹介しました。
デザインパターンとは、オブジェクト指向プログラミング言語でのプログラミングの際、基本となる設計パターンとしてまとめられたものです。最も有名なものにはGoFがあり、「生成」、「構造」、「振る舞い」の3つのパターンに分類されています。
今回紹介したデザインパターンを勉強することで、プログラミングのスキルアップにつながります。是非、プログラミングのデザインパターンの習得を目指して勉強してみてください。