【オブジェクト指向】デザインパターンについて



## デザインパターンとは
JavaやRubyなどオブジェクト指向言語において、よく使われる設計をパターン化したものです。
これを用いることでプログラムが再利用しやすくなり、読みやすいものとなります。

## デザインパターンの種類
「GoF」のデザインパターンがあり、全23種の設計パターンに分けられており、大カテゴリーに分けると
「生産」「構造」「振る舞い」の3つに分けることができます。

+ 生産
  + [Abstract Factory](#abstract-factory)
  + [Builder](#builder)
  + [Factory Method](#factory-method)
  + [Prototype](#prototype)
  + [Singleton](#singleton)
+ 構造
  + [Adapter](#adapter)
  + [Bridge](#bridge)
  + [Composite](#composite)
  + [Decorator](#decorator)
  + [Facade](#facade)
  + [Flyweight](#flyweight)
+ 振る舞い
  + [Chain of Responsibility](#chain-of-responsibility)
  + [Command](#command)
  + [Interpreter](#interpreter)
  + [Iterator](#iterator)
  + [Mediator](#mediator)
  + [Memento](#memento)
  + [Observer](#observer)
  + [State](#state)
  + [Strategy](#strategy)
  + [Template Method](#template-method)
  + [Visitor](#visitor)

## 各デザインパターンの概要

### 「生産」

#### Abstract Factory

Abstract Factory を日本語に直訳すると「抽象的な工場」となります。
インスタンスの生成を専門に行うクラスを用意することで、整合性を必要とされる一連のオブジェクト群を間違いなく生成するためのパターンです。

#### Builder

builder を日本語に直訳すると「建築者・建築業者」となります。
同じ作成過程で異なる表現形式の結果を得るためのパターンです。

#### Factory Method

Factory Method を日本語に直訳すると「工場方式」となります。
オブジェクトの生成方法に一工夫加えることで、より柔軟にオブジェクトを生成することを目的とするものです。インスタンスの生成をサブクラスに行わせることで、より柔軟に生成するインスタンスを選択することが可能となります。

#### Prototype

prototype を日本語に直訳すると「試作品・原型」となります。
あらかじめ用意しておいた「原型」からインスタンスを生成するようにするためのパターンです。

#### Singleton

singleton を日本語に直訳すると「一枚札」となります。
コンストラクタを private とすることで、他クラスから新たにインスタンスが生成されないような構造とすることで、インスタンスの生成を制御します。
このような唯一の存在を保証するためのパターンです。

### 「構造」

#### Adapter

adapter を日本語に直訳すると「適合させるもの」となります。
インタフェースに互換性の無いクラス同士を組み合わせることを目的としたパターンです。
既存のクラスをラップして利用することになるため、素早く必要な機能を作成することが可能となります。

#### Bridge

bridge を日本語に直訳すると「橋」となります。
「機能追加」と「機能実装」のクラス層を繋げる役割を果たす方法です。
機能クラスと実装クラスを分けることで、独立性が高まり、拡張がしやすくなります。

#### Composite

composite を日本語に直訳すると「複合物」となります。
Compositeパターンは、入れ物クラスと実体クラスを抽象クラスでまとめ、同一視できるようにするデザインパターンです。
同一視させることにより、利用者側からは入れ物か実体かを意識する必要がなくなります。

#### Decorator

decorator を日本語に直訳すると「装飾者」となります。
オブジェクトに対してデコレーション(飾り付け)を行い機能拡張していく方法がDecoratorパターンです。
飾り付けを行うオブジェクトには一切手を加えることなく、飾り付けるオブジェクトにより機能を追加していくことが可能です。

#### Facade

facade を日本語に直訳すると「建物の正面」となります。
複雑に関連を持っているクラス群に窓口を設けることで、シンプルに利用出来るようにする方式がFacadeパターンです。
窓口となるインターフェース用のクラスを用意しておくことで、様々なクラスを制御する必要がなくなります。

#### Flyweight

flyweight を日本語に直訳すると「フライ級」となります。
同じインスタンスを共有することで、無駄なインスタンスを生成しないようにして、 プログラム全体を軽くすることを目的としたパターンです。

### 「振る舞い」

#### Chain of Responsibility

 Chain of Responsibility を日本語に直訳すると「責任の鎖」となります。
 「責任」を負ったものが、「鎖」状につながれた状態をイメージさせるパターンです。
 複数のオブジェクトで鎖のように関係性を持たせ、利用者側はいずれかのオブジェクトに要求するだけで自動的に処理出来るオブジェクトに要求を回してくれるようになります。

#### Command

command を日本語に直訳すると「命令」となります。
命令を1つのオブジェクトとして管理するのがCommandパターンです。
1つのオブジェクトで管理することにより、追加や削除・実行といった処理管理がしやすくなり、再利用もしやすくなります。

#### Interpreter

interpreter を日本語に直訳すると「解釈者・説明者」となります。
「解析した結果」得られた手順に則った処理を実現するために最適なパターンです。
Interpreterパターンでは、1つの規則を1クラスで記述するのが原則です。

#### Iterator

iterator を日本語に直訳すると「反復子」となります。
要素の集まりを保有するオブジェクトの各要素に順番でアクセスする方法を提供するためのパターンです。

#### Mediator

mediator を日本語に直訳すると「仲裁人・調停者」となります。
複数のオブジェクト間で調整を行うために、 各オブジェクトからの問い合わせを受けて、 適切な判断をして指示を出す「仲裁人」としての役割を果たすクラスを利用するパターンです。

#### Memento

memento を日本語に直訳すると「記念品・形見」となります。
インスタンスのあるときの状態をスナップショットとして保存しておくことで、 その時のインスタンスの状態を復元することを可能にするものです。

#### Observer

observer を日本語に直訳すると「観察者」となります。
状態の変化を観察することを目的としたものですが、どちらかというと「観察」よりも「通知」に重点の置かれたものになっています。

#### State

state を日本語に直訳すると「状態」となります。
クラスを切り替えることにより状態変化を表現するのがStateパターンです。
状態遷移図の状態をそのままクラスとして表現することが出来るため、処理が分かりやすくなります。

#### Strategy

strategy を日本語に直訳すると「戦略」となります。
戦略の切り替えや追加が簡単に行えるようになるパターンです。
メソッドの中に溶け込んだ形のアルゴリズムより柔軟でメンテナンスしやすい設計となります。

#### Template Method

Template Method を日本語に直訳すると「型の方式」となります。
スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を実装します。スーパークラスでは、アルゴリズムの流れの中で利用される抽象的なメソッドと、この抽象的なメソッドを利用して、処理のアルゴリズムを定義する templateMethod メソッドを定義します。

#### Visitor

visitor を日本語に直訳すると「訪問者」となります。
受け入れる側に処理を追加することなく、処理を追加することができるパターンです。
処理対象となる、Acceptor オブジェクトは、Visitor オブジェクトを受け入れる accept(Visitor visitor)メソッドを実装している必要があります。

## まとめ

どの言語を使用しようとオブジェクト指向はほんとに大事だと思います。
私も、文法等を覚えられたとしても**カプセル化**、**抽象化**、**継承**、**多態性**の4つの基本概念がまだまだ使いこなせていないです…

引用元の[デザインパターン|TECHSCORE(テックスコア)](https://www.techscore.com/tech/DesignPattern/)にはデザインパターンのサンプルケースもあるため確認していただきたい。


## 参考
+ [デザインパターン|TECHSCORE(テックスコア)](https://www.techscore.com/tech/DesignPattern/)
+ [【Java】デザインパターンって何？23 種の概要を掴もう](https://style.potepan.com/articles/35080.html#i-2)

<br>
著者: E.R (株式会社ウィズツーワン)