デザインパターンとは?
状態:-
閲覧数:1,927
投稿日:2018-07-24
更新日:2018-07-28
表記
英語
・design pattern
オブジェクト設計において、定石となる手法をパターン化したもの
効率の良いプログラミングをするために、良いソースコードをパターン化したもの
・過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したもの
・オブジェクト指向ソフトウェアを設計する際に繰り返し現れる経験的な要素を抽出したもので、効率の良いプログラミングをするためのテンプレート
書籍『オブジェクト指向における再利用のためのデザインパターン』において、GoF (Gang of Four) と呼ばれる4人の共著者が取り上げた23種類のパターンが最も有名
・デザインパターンという用語を初めてソフトウェア開発に導入した
・GoFは、エーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディースの4人である
・彼らは、その書籍の中で23種類のパターンを取り上げた
Gang of Four
・英語で4人組のこと
・英語のgangには、日本語の「ギャング」の意味もあるが、一般的な「グループ」の意味でも用いられる
デザインパターン23種
主要な23種
GoF本では、23個のデザインパターンの目的を、次の3つのカテゴリに分類
・オブジェクトの生成に関するパターン
・プログラムの構造に関するパターン
・オブジェクトの振る舞いに関するパターン
オブジェクト生成に関するパターン
1 | AbstractFactory | 関連する部品を生成するファクトリごと切り替える ・関連する一連のインスタンスを状況に応じて、適切に生成する方法を提供する ・互いに関連したり依存し合うオブジェクト群を、その具象クラスを明確にせず生成するためのインタフェースを提供 |
- |
---|---|---|---|
2 | Builder | 複雑なオブジェクトを生成する ・複合化されたインスタンスの生成過程を隠蔽する ・複合オブジェクトについて、その作成過程を表現形式に依存しないものにすることにより、同じ作成過程で異なる表現形式のオブジェクトを生成できるようにする |
- |
3 | FactoryMethod | 子クラスのメソッドにインスタンスの生成方法をまかせる ・実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する ・オブジェクトを生成するときのインタフェースだけを規定して、実際にどのクラスをインスタンス化するかは子クラスが決めるようにする。インスタンス化を子クラスに任せる |
- |
4 | Prototype | コピーしてインスタンスを生成する ・同様のインスタンスを生成するために、原型のインスタンスを複製する ・生成すべきオブジェクトの種類を原型となるインスタンスを使って明確にし、それをコピーすることで新たなオブジェクトの生成を行う |
- |
5 | Singleton | 生成するインスタンスを1個に制限する ・あるクラスに対してインスタンスが1つしか存在しないことを保証し、それにアクセスするためのグローバルな方法を提供 |
- |
プログラムの構造に関するパターン
6 | Adapter | インタフェースが一致しないクラスを再利用する ・元々関連性のない2つのクラスを接続するクラスを作る ・あるクラスのインタフェースを、クライアントが求める他のインタフェースへ変換する。インタフェースに互換性のないクラス同士を組み合わせることができるようにする |
- |
---|---|---|---|
7 | Bridge | 機能と実装の階層を分離し、拡張を別々に行う ・抽出されたクラスと実装を分離して、それらを独立に変更できるようにする ・クラスなどの実装と、呼出し側の間の橋渡しをするクラスを用意し、実装を隠蔽する |
- |
8 | Composite | 元になるオブジェクトを包み込んで機能を拡張する ・再帰的な構造を表現する ・部分-全体階層を表現するために、オブジェクトを木構造に組み立てる。クライアントは、個々のオブジェクトとオブジェクトを合成したものを一様に扱うことができるようになる |
- |
9 | Decorator | 元になるオブジェクトを包み込んで機能を拡張する ・あるインスタンスに対し、動的に付加機能を追加する。Filterとも呼ばれる ・オブジェクトに責任を動的に追加する。子クラス化よりも柔軟な機能拡張方法を提供する |
- |
10 | Facade | 複雑な処理を呼び出すシンプルな入り口を提供する ・複数のサブシステムの窓口となる共通のインタフェースを提供する ・サブシステム内に存在する複数のインタフェースに1つの統一インタフェースを与える ・サブシステムの利用を容易にするための高レベルインタフェースを定義する |
- |
11 | Flyweight | インスタンスを共有して、インスタンスの生成コスト・使用メモリを抑える ・多数のインスタンスを共有し、インスタンスの構築のための負荷を減らす ・多数の細かいオブジェクトを効率よくサポートするために共有を利用する |
- |
12 | Proxy | 代理(プロキシ)を用意してインスタンスの生成やアクセス制限をコントロールする ・あるオブジェクトへのアクセスを制御するために、そのオブジェクトの代理、または入れ物を提供 ・共通のインタフェースを持つインスタンスを内包し、利用者からのアクセスを代理する。Wrapperとも呼ばれる |
- |
オブジェクトの振る舞いに関するパターン
13 | ChainOfResponsibility | 処理を順番にたらい回す ・イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡されてゆくようにする ・1つ以上のオブジェクトに要求を処理する機会を与えることにより、要求を送信するオブジェクトと受信するオブジェクトの結合を避ける。受信する複数のオブジェクトをチェーン状につなぎ、あるオブジェクトがその要求を処理するまで、そのチェーンに沿って要求を渡していく |
- |
---|---|---|---|
14 | Command | 命令そのものをオブジェクトとして扱う ・複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切り替えることで、操作の切替えを実現する ・要求をオブジェクトとしてカプセル化することによって、異なる要求や、要求からなるキューやログにより、クライアントをパラメータ化する。また、取り消し可能なオペレーションをサポートする |
- |
15 | Interpreter | 構文解析の結果を表現するクラスを定義する ・構文解析のために、文法規則を反映するクラス構造を作る ・言語に対して、文法表現と、それを使用して文を解釈するインタプリタを一緒に定義する |
- |
16 | Iterator | 複数のオブジェクトに順番にアクセスする ・集約オブジェクトが基にある内部表現を公開せずに、その要素に順にアクセスする方法を提供する ・複数の要素を内包するオブジェクトのすべての要素に対して、順番にアクセスする方法を提供する。反復子。 |
- |
17 | Mediator | 複数のオブジェクトを集中管理する ・オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低くする ・オブジェクト群の相互作用をカプセル化するオブジェクトを定義する。オブジェクト同士がお互いに明示的に参照し合うことがないようにして、結合度を低めることを促進する。それにより、オブジェクトの相互作用を独立に変えることができるようになる |
- |
18 | Memento | オブジェクトの状態を保管して復元可能にする ・データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操作の再現が行えるようにする ・カプセル化を破壊せずに、オブジェクトの内部状態を捉えて外面化しておき、オブジェクトを後にこの状態に戻すことができるようにする |
- |
19 | Observer | オブジェクトの状態変化を通知する ・インスタンスの変化を他のインスタンスから監視できるようにする。Listenerとも呼ばれる ・あるオブジェクトが状態を変えたときに、それに依存するすべてのオブジェクトに自動的にそのことが知らされ、また、それらが更新されるように、オブジェクト間に一対多の依存関係を定義する |
- |
20 | State | 状態に応じて処理内容を切り替える ・オブジェクトの状態を変化させることで、処理内容を変えられるようにする ・オブジェクトの内部状態が変化したときに、オブジェクトが振る舞いを変えるようにする ・クラス内では振る舞いの変化を記述せず、状態を表すオブジェクトを導入することでこれを実現する |
- |
21 | Strategy | アルゴリズムを交換可能にする ・データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切替えを容易にする ・アルゴリズムの集合を定義し、各アルゴリズムをカプセル化して、それらを変換可能にする。アルゴリズムを、それを利用するクライアントからは独立に変更することができるようになる |
- |
22 | TemplateMethod | 一連の処理の一部をサブクラスで実装し、変更可能とする ・あるアルゴリズムの途中経過で必要な処理を抽象メソッドに委ね、その実装を変えることで処理が変えられるようにする ・1つのオペレーションにアルゴリズムのスケルトンを定義しておき、その中のいくつかのステップについては、子クラスでの定義に任せることにする。アルゴリズムの構造を変えずに、アルゴリズム中のあるステップを子クラスで定義する |
- |
23 | Visitor | 複数のオブジェクトを渡り歩く処理を追加・変更する ・データ構造を保持するクラスと、それに対して処理を行うクラスを分離する ・あるオブジェクトを構造上の要素で実行されるオペレーションを表現する。オペレーションを加えるオブジェクトのクラスに変更を加えずに、新しいオペレーションを定義することができるようになる |
- |
導入メリット / 静的動的
デザインパターンを使用しないと?
ソフトウェアを何度も設計する場合
・共通する機能や問題を解決するために毎回ゼロから設計
・非常に効率が悪い
デザインパターンを使用すると?
デザインパターンを使用して設計されたクラス
・クラスどうしの関係がゆるくなる(疎結合)
※良い設計の重要なポイントの1つ
・クラス同士の関係がゆるければゆるいほど、独立性が高くなる
→ 再利用性が高くなる
利用範囲で分類
生成 | 構造 | 振る舞い | |
---|---|---|---|
クラス | Factory Method | Adapter | Interpreter、Template |
オブジェクト | Abstract Factory、Builder、Prototype、Singleton | Adapter、Bridge、Composite、Decorator、Façade、Flyweight、Proxy | Chain of Responsibility、Command、Iterator、Mediator、Memento、 Observer、State、Strategy、Visitor |
静的動的
静的
・クラス定義時点でクラス同士の関係が決定
<?php
class SomeClass
{
:
}
/**
* この時点でクラスどうしの関係が決まる
*/
class AnotherClass extends SomeClass
{
:
}
動的
・オブジェクトどうしの関係を実行時に決定
・クラス内部でnew演算子を使ってインスタンスを生成し、オブジェクト同士の関係を決めるコードの例
<?php
:
class SomeClass
{
private $object;
:
public function SomeMethod()
{
/**
* このタイミングでオブジェクトどうしの関係が決まる
*/
$this->object = new AnotherClass();
:
}
}
・アクセサメソッドを使ってオブジェクトを他のオブジェクトに挿入することで、オブジェクト同士の関係を決める例
<?php
:
$object = new SomeClass();
$another_object = new AnotherClass();
/**
* このタイミングでオブジェクトどうしの関係が決まる
*/
$object->setObject($another_object);
:
PHPによるデザインパターン入門
“デザインパターン” の検索結果
デザインパターンを読み解く
サルでもわかる 逆引きデザインパターン
デザインパターン (ソフトウェア)
ryo-utsunomiya/gof_design_patterns_in_php: Sample implementations of GoF Design Patterns in PHP
デザインパターン入門