#はじめに
大学の研究室でデザインパターンをPythonで書くことになりました。
だがデザインパターンもちゃんと理解できていないのに、Pythonで書けないと感じました。
なので、Javaと好きなJavaScriptでのデザインパターンを比較して理解していこうと思います。
全てのパターンをこの記事に書くと長くなってしまうので、パターンごとに記事を作り下の表を埋めていく形にしていきます。
※パターン名がリンクになっています。
#デザインパターンとは
ソフトウェアの設計でよく起こる問題を解決し、再利用可能にする慣例
GoF(Gang of Four)の23種類のデザインパターンが有名である
GoFは『エーリヒ・ガンマ』『リチャード・ヘルム』『ラルフ・ジョンソン』『ジョン・ブリシディース』の4人
『オブジェクト指向における再利用のためのデザインパターン』でデザインパターンとうい用語を初めてソフトウェア開発に導入した
#デザインパターンのカテゴリー
デザインパターンはさまざまな視点から分類することができる
##生成に関するパターン
オブジェクトを作成する仕組みに着目し、オブジェクト生成の過程を制御することによって、問題を解決する
パターン名 | 概要 |
---|---|
Factory Method | 渡されたデータやイベントをもとに派生クラスのインスタンスを作成する |
Abstract Factory | 具象クラスの細部を明らかにせずにクラスのインスタンスを作成する |
Builder | オブジェクトの作成過程を表現形式と切り離す。常に同じタイプのオブジェクトを作成する |
Prototype | コピーの際に、完全に初期化されたインスタンスを利用する |
Singleton | グローバルからアクセスできるインスタンスが一つしかないクラス |
##構造に関するパターン | |
オブジェクトの合成に関するもので、異なるオブジェクト間の関係性をわかりやすくするために使われる |
パターン名 | 概要 |
---|---|
Adapter | 異なるクラスのインターフェイスを対応させて、インターフェイスが対応していないクラス同士でも組み合わせて使えるようにする。 |
Bridge | オブジェクトのインターフェイスを実装から切り離し、インターフェイスと実装をそれぞれ独自に変更できるようにする |
Composite | 個々のオブジェクトとオブジェクトを合成したものの構造を一様に扱うことで、別々に扱うよりも多くのことができる |
Decorator | オブジェクトに動的に処理を追加する |
Facade | 一つのクラスがサブシステム全体の複雑性を隠蔽する |
Flyweight | いたるところで使われている情報を効率的に共有するために、小さなサイズのインスタンスを利用する |
Proxy | 本物のオブジェクトの代わりとなる代理オブジェクト |
##振る舞いに関するパターン
システム内の異なるオブジェクト間の通信を改善簡素化することに着目した
パターン名 | 概要 |
---|---|
Interpreter | アプリケーションに言語的要素を追加し、対象とする言語の文法に対応する |
Template Method | メソッド内にアルゴリズムのかたまりを作り、サブクラスへのステップを遅延させる |
Chain of Responsibility | 一連のオブジェクトの中でリクエストを順番に渡していき、その要素を対処できるオブジェクトを見つける方法 |
Command | コマンドの実行動作をコマンドを発行する立場から切り離す |
Iterator | コレクションの内部動作について知ることなく、そのコレクションの要素に順番にアクセスしていく |
Mediator | クラス間のやり取りを簡素化し、クラス同士が直接参照し合うのを防ぐ |
Memento | オブジェクトの内部状態を記録し、後でそれを復元できるようにする |
Observer | 変更をたくさんのクラスに通知し、クラス間の一貫性を保証する方法 |
State | 状態が変わった時にオブジェクトの振る舞いを変える~ |
Strategy | クラス内部のアルゴリズムをカプセル化し、アルゴリズムの選択をクラスの実装から独立させる |
Visitor | クラスを変更することなく、そのクラスに新たなオペレーションを追加する |