TanukiEngineerの1歩ずつ進もうよ!

まだまだ駆け出しエンジニアの学習メモ

デザインパターンの種類

23種類のGoFデザインパターンは3つに分類されています。

オブジェクトの生成に関するパターン

  パターン名    説明
Abstract
Factory
アブストラクトファクトリー)
・関連する部品(オブジェクト群)をまとめて一つのシステムを生成するための手順を抽象化
・抽象的な部品を組み合わせて抽象的な製品を作る抽象的な工場
・abstract(アブストラクト)は「抽象的な」という意味で、factory(ファクトリー)は「工場」という意味である
・abstract factoryは「抽象的な工場」という意味である
Builder
(ビルダー)
・元となる専用のクラスを用意し、複数のオブジェクトを生成
・構造を持ったインスタンスを組み上げていく
・一般に構造を持っている大きなものを建築したり構築したりすることを英語でbuild(ビルド)という
Factory
Method
(ファクトリーメソッド)
インスタンス生成のための枠組みと、インスタンス生成のクラスを分離
・クラスを増やし、機能を拡張する際に使用
インスタンスの作り方をスーパークラス側で定め、具体的な肉付けはすべてサブクラス側で行う
・factoryという英単語の意味は、「工場」である
・Factory Methodはインスタンスを生成する工場をTemplate Methodパターンで構成したもの
Prototype
(プロトタイプ)
・クラスからインスタンスを生成するのではなく、インスタンスをコピーして新しいインスタンスを作成(クローンの作成)
・同じクラスで複数のオブジェクトを生成する際に作業を効率化
Singleton
(シングルトン)
・1つのクラスから1つのインスタンスだけを生成するように制限
・singletonとは、要素を1つしか持たない集合のこと
・指定したクラスのインスタンスが絶対に1個しか存在しないことを保証したい場合やインスタンスが1個しか存在しないことをプログラム上で表現したい場合などに使われる

プログラムの構造に関するパターン

パターン名 説明
Adapter
(アダプター)
・本来関連のないクラス同士を関連付ける
・「すでに提供されているもの」と「必要なもの」との間のズレを埋める(インターフェース(API)が異なっているクラス同士を結びつけるパターン)
Bridge
(ブリッジ)
・ 機能を拡張するクラスと実装するクラスを分離し、その間の橋渡しを行う
・継承元のスーパークラスの抽象メソッドを適切に実装したり、サブクラスで機能を拡張する際に利用
・ 2種類のクラス階層を分離することで、それぞれのクラス階層を独立に拡張することができる
・bridge(ブリッジ)というのは「橋」という意味である
Composite
(コンポジット)
・フォルダ内のサブフォルダとファイルの関係のように再帰的な構造を作る際に利用
・composite(コンポジット)とは英語で「混合物」「複合物」という意味
Decorator
(デコレータ)
・透過的なインターフェース(API)を保ったまま、オブジェクトを次々にかぶせて、機能を次々に追加する
・dekorator(デコレータ)とは、「decoreate(デコレート)(飾り付け)するものという意味
Facade
ファサード
・複数のクラスを適切に制御するための「窓口」役のクラスを作成し、その「窓口」から各クラスへ指令を出す
・複雑なシステムに対するシンプルな窓口の役を果たす
・facade(ファサード)はフランス語のfacadeを語源とする単語で、「建物の正面」という意味である
Flyweight
(フライウエイト)
・小さなオブジェクトを数多くロードする必要がある場合にインスタンスを可能な限り共有させて、無駄にインスタンスを作成せずに効率的に処理を行う
flyweightというのは「フライ級」のことで、ボクシングで最も体重が軽い階級を表す
Proxy
(プロキシー
・「代理」に処理を肩代わりさせ、重い処理は必要な時点まで遅らせることが可能
・proxy(プロキシー)という単語は「代理人」という意味である

オブジェクトの振る舞いに関するパターン

  パターン名   説明
Chain of
Responsibility
(チェーンオブレスポンシビリティー
・あるクラスのオブジェクトが処理可能なら処理を行い、
処理不可の場合は他のクラスのオブジェクトに送って処理を実行
・要求するインスタンスを鎖状に並べておき、要求を処理できるかをチェックしていく「たらい回し」のパターン
・responsibility(レスポンシビリティー)とは責任のこと
Command
(コマンド)
・「マウスをクリック」「キーを押す」のような命令をインスタンスという「モノ」で管理
・command(コマンド)という単語は「命令」という意味である
Interpreter
インタプリタ
・プログラムをミニ言語に分け、そのミニ言語を「通訳」するプログラムを作成
・変更が必要な場合はミニ言語を書き換える
interpreterは通訳という意味
Iterator
イテレータ
・複数のオブジェクトを順番に指し示し、全体をスキャンしていく処理を行う(1つ1つ数え上げていく)
・iterate(イテレートという英単語は何かを「繰り返す」という意味である)
Mediator
(メディエイター)
・「相談役」が複雑なオブジェクトの状態を把握し、適切な判断と支持を行う
・複雑に絡み合うオブジェクトたち相互の通信をやめ、Mediator役に情報を集中させることによって処理を整理する
GUIアプリケーションで特に効果的なパターン
・mediatorは英語で「調停者」「仲介者」という意味である
Memento
メメント
インスタンスの状態を表す役割を設け、インスタンスの状態の保存と復元を行う
・Mementoパターンを利用すると、プログラムに対して、
 undo(アンドゥ:やり直し)、
 redo(リドゥ:再実行)、
 history(ヒストリー:作業履歴の作成)、
 snapshot(スナップショット:現在状態の保存)
などを行うことができる
・memento(メメント)という英単語は「記念品」「形見」「思い出の種」という意味である
Observer
(オブザーバ)
・if文を利用することなく、状態変化に対応した処理を実行
・観察対象の状態が変化すると、観察者に対して通知される
・observerとは、観察(observe:オブザーブ)する人、すなわち「観察者」という意味である
State
(ステート)
・状態をクラスとして表現し、クラスを切り替えることで状態の変化を表す
・state(ステート)とは英語で「状態(ものごとのありさま)」を意味する
Strategy
(ストラテジー
アルゴリズムの実装部分が交換可能で、変更が容易
アルゴリズムを切り替えることで、同じ問題を別の方法で解くのを容易にする
・strategy(ストラテジー)というのは、「戦略」という意味である。
Template Method
(テンプレートメソッド)
スーパークラスで処理の枠組みを定め、サブクラスでその具体的な内容を定義する
Visitor
(ビジター)
・データ構造と処理を分離
・データ構造を渡り歩く「訪問者」を表すクラスを用意し、そのクラスが処理を実施
・新しい処理を追加したい場合は新しい「訪問者」を作成
・データ構造側は必要に応じて「訪問者」を受け入れる
・visitor(ビジター)というのは「訪問者」という意味である

参考サイト

Javaデザインパターン全23種の特長をスッキリ解説 | 侍エンジニアブログ

参考書籍

「増補改訂版Java言語で学ぶデザインパターン入門」