デザインパターン覚書(自分の備忘用)

(1)Iteratorパターン
Iteratorパターンは集約オブジェクトの種類や実装に依存しない、統一的な走査方法を提供したいような場合に利用する
![Iterator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/a08565ef-0714-3cf3-4643-5c8b48809227.png)

(2)Adaptorパターン
Adapter パターンは利用したいインタフェースを強制的に変えたいような場合に利用する
![Adaptor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/1d3f7ab4-167c-7e3d-7a27-117f72774a4e.png)

　上はTargetを実装しAdapteeを継承する。下はTargetから継承しAdapteeを集約する。

(3)TemplateMethodパターン
スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を実装する。
![templateMethod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/f05cedb8-be08-fabd-41e1-5a6a693f6960.png)

(4)FactoryMethodパターン
インスタンスの生成をサブクラスに行わせる
![FactoryMethod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/426e620f-58f4-5c0f-1387-091e501af374.png)

(5)Singletonパターン
あるクラスのインスタンスが一つしかないことを保証する
![sungleton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/c3646f4c-072d-5555-99dc-3cb8ac9b1e47.png)

(6)Prototypeパターン
プロトタイプからインスタンスを生成する
![prototype.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/09ed480c-f965-5a8f-bfb1-595af1980722.png)

(7)Builderパターン
「作成過程」を決定する Director と呼ばれるものと「表現形式」を決定する Builder と呼ばれるものを組み合わせることで、オブジェクトの生成をより柔軟にし、そのオブジェクトの「作成過程」をもコントロールすることができるようにする
![builder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/bbe6b808-a64f-529d-bf22-0d263bfff071.png)

(8)AbstractFactoryパターン
インスタンスの生成を専門に行うクラスを用意することで、整合性を必要とされる一連のオブジェクト群を間違いなく生成する
![abstractfactory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/19f818d1-03fe-a127-56d2-82f6ccec23d0.png)

(9)Bridgeパターン
機能と実装を分離して、それぞれを独立に拡張することができるようになる
![bridge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/56186ad3-b74f-9386-1920-9e74bc2f8bf4.png)

(10)Strategyパターン
戦略(Strategy)の切り替えや追加が簡単に行えるようになる
![strategy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/046dc95b-076c-53cd-899e-40ce24ebc3c5.png)

(11)Compositeパターン
「容器と中身を同一視する」ことで、再帰的な構造の取り扱いを容易にする
```plantuml
class Component {
  + method1(): void
  + method2(): void
}
class Composite {
  - components: List
  + add(): void
  + method1(): void
  + method2(): void
}
class Leaf {
  + method1(): void
  + method2(): void
}
Component <|--o Composite
Component <|-- Leaf
```

(図では分かりずらいがComonentからCompositeへ集約している)

(12)Decoratorパターン
飾り枠と中身を同一視することで、より柔軟な機能拡張方法を提供
![decorator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/4f28d681-1124-3ce9-6b7e-dfd02016c656.png)

(13)Visitorパターン
「処理」を訪問者である Visitor オブジェクトに記述することで、処理の追加を簡単にします。処理対象となる、Acceptor オブジェクトは、Visitor オブジェクトを受け入れる accept(Visitor visitor)メソッドを実装している必要があります
![visitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/b292ca3e-f4bf-32c9-1591-1a2b1f0f7dc2.png)

(14)Chain of Responsibilityパターン
「責任」を負ったものが、「鎖」状につながれた状態をイメージさせるパターン
![chainofresponsibility.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/24023a84-9a5b-950f-edcb-2553dbeefca1.png)

(15)Facadeパターン
既存のクラスを複数組み合わせて使う手順を、「窓口」となるクラスを作ってシンプルに利用できるようにする
![facade.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/7d89da7f-b1fd-f220-c002-4bebc4c9daaf.png)

(16)Mediatorパターン
複数のオブジェクト間の調整をするために、 各オブジェクトからの問い合わせを受け、 適宜判断を行い指示を出す「仲裁人」の役割を果たすクラスを利用する
![mediator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/4ff793cd-c3af-747c-1618-3a13292da62e.png)

(17)Observerパターン
状態の変化を観察することを目的としたもの
![observer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/ab97ebb1-350f-0214-f67f-e4ce6ff83df0.png)

(18)Mementoパターン
インスタンスのあるときの状態をスナップショットとして保存しておくことで、 その時のインスタンスの状態を復元することを可能にするもの
![memento.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/72f7e6af-9393-d9aa-1a23-54c36d1afc03.png)

(19)Stateパターン
状態の変化に応じて振る舞いが変わるような場合に威力を発揮するパターン
![state.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/4e0d269a-fac7-042e-3e5d-06b0f3c59a91.png)

(20)Flyweightパターン
同じインスタンスを共有することで、無駄なインスタンスを生成しないようにして、 プログラム全体を軽くすることを目的としたパターン
![flyweight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/f3d593d9-adef-c491-9fc7-f781704bb6ea.png)

(21)Proxyパターン
要求を代理人オブジェクトが受け取って処理するパターン
![proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/30d2bff7-ba9c-bf06-0b89-e3bc574360d4.png)

(22)Commandパターン
要求をCommandオブジェクトにして、それらを複数組み合わせて使えるようにするパターン
![command.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/6f1fe856-27b9-a3da-6886-0170598eba19.png)

(23)Interpretorパターン
「解析した結果」得られた手順に則った処理を実現するために最適なパターン
![interpreter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377078/f4aea1ce-3926-0f64-7c7f-b0aa8ef21a4b.png)