デザインパターンをJavaScriptとJavaでの実装を比較して理解する【随時更新】

  • 12
    Like
  • 0
    Comment

はじめに

大学の研究室でデザインパターンを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 クラスを変更することなく、そのクラスに新たなオペレーションを追加する

参考

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