SoftwareDesignPattern

# 概要
ずっと気になっていたデザインパターンを勉強したのでメモ。
[「Java言語で学ぶデザインパターン入門」](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030)を購入して自分なりの言葉で理解をまとめる

# 生成に関するパターン
## FactoryMethod
### クラス図
![class_factory_method.png](https://qiita-image-store.s3.amazonaws.com/0/188761/52dd310b-fca4-0182-89c2-607a149633a7.png)

### シーケンス図
![FactoryMethodSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/5e0363a7-7e3a-a20f-68ab-333d495159f8.png)

### 使い所（一言）
- インスタンス生成を別出しにしてまとめたいとき

### 利点
- インスタンス生成時に必要なフローをひとまとめにできる
- インスタンス生成呼び出し元の保守性が高まる
    - インスタンス生成フローに変更が生じても呼び出し元クラスをごちゃごちゃ修正しなくて良い

### 例
- IDCardの生成

## Abstract factory
### クラス図
![AbstractFactory.png](https://qiita-image-store.s3.amazonaws.com/0/188761/9ee50b88-4543-2618-bca1-f64d4979f5f3.png)

### シーケンス図
![AbstractFactorySequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/cb6c447d-670f-89ab-845b-4de96deef552.png)


### 使い所（一言）
インスタンス生成をまとめたファクトリーが複数あって、その具体的なファクトリーをちょろちょろ切り替えて使いたい場合

### 利点
- インスタンス生成時に必要なフローをひとまとめにできる
- インスタンス生成呼び出し元の保守性が高まる。変更時呼び出し元クラスをごちゃごちゃ修正しなくていい
- インスタンス生成をまとめた具体的なファクトリーを複数作って容易に切り替えることができる

### 例
- HTML内のリンクの生成やテーブルの作成

## builder
### クラス図
![builder_class.png](https://qiita-image-store.s3.amazonaws.com/0/188761/662dc8d9-f060-c02c-c025-ac6ac6452e64.png)

### シーケンス図
![builder_sequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/542a8568-ce8b-22ab-c045-3bab762c3871.png)

### 使い所（一言）
呼び出し元から１つのメソッドでまとまった何かを生成したい！まとまった何かはカチカチっと入れ替え可能！

### 利点
- まとまった何か（クラス）の切り替えが容易に行える

### 例
- TEXT形式やHTML形式で文章を生成

## Singleton
### クラス図
![SingletonClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/a57787f8-9494-e56d-c999-0ca85a2ad2ce.png)


### シーケンス図
![SingletonSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/e9e82ed6-9c3b-c181-53b1-f82ce46b96f5.png)

### 使い所（一言）
インスタンスを１つしか生成したくない場合

### 利点
- インスタンスが一つであることが担保される

## Prototype
### クラス図
![PrototypeClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/761e5aee-9e1b-c617-8b0f-c4947100beb0.png)

### シーケンス図
![PrototypeSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/693a6046-3330-0653-bdfd-4278e4aa7fae.png)

### 使い所（一言）
毎回インスタンス（オブジェクト）を生成するのは適さないものを複製する！

### 利点
- 毎度クラスで定義するには種類が多すぎる場合有効

# 構造に関するパターン
## Adapter
### クラス図
![AdapterClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/579f2b35-12f9-f7eb-a050-68510c3ac16a.png)

### シーケンス図
![AdapterSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/d85ff4bb-98b9-22dc-abb0-530a429e63b3.png)

### 使い所（一言）
既存クラスに一皮被せて自分の意図したメソッドが使えるクラスを作る

### 利点
- 既存クラスを崩すことなく意図したメソッドを実行することができる
- バージョンアップ等の互換性にも対応できる

## Bridge
### クラス図
![brindgeClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/4a9f31e7-ca96-5443-bdcf-f8a4d90d6c0e.png)

### シーケンス図
![bridgeSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/b70c2b3a-a39b-aed4-89b0-619235a93edc.png)

### 使い所（一言）
「機能」と「実装」を別クラスで実装したい時

### 利点
- OSによる違いなどを実装側に記載することで環境による機能実現差異を吸収してくれる

## Composite
### クラス図
![CompositeClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/1bd0fb9a-c664-9b66-e5b2-8f57a29cf551.png)

### シーケンス図
![CompositeSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/7f51d495-7479-f46b-b69e-90403b7104f8.png)

### 使い所（一言）
複数のクラスを単一のものと見ることで同一処理を再帰的に行いたいとき！

### 利点
- 毎度色々なオブジェクトのメソッドを実行せず、再帰的に処理を実行させることができる

## Decorator
### クラス図
![DecoratorClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/fcb4b9dd-80e8-5e8e-bbc4-1bb8729da5d7.png)

### シーケンス図
![DecoratorSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/f69d09c6-07aa-7875-835e-25484d3657cd.png)

### 使い所（一言）
既存機能を様々な種類で装飾（拡張）したい時！

### 利点
- 同じメソッド名で最低限の機能を拡張していける

## Facade
### クラス図
![FacadeClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/2b835ab8-eadb-0897-c2cb-d371f1a58d03.png)

### 使い所（一言）
複雑な処理を簡単な窓口（API）から利用させたい時

### 利点
- 内部の複雑な処理を意識せず簡単なAPIから機能を呼び出すことができる

## Flyweight
### クラス図
![FlyweightClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/908645bf-f878-9762-a422-35aa1d3952d5.png)

### シーケンス図
![flyweightSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/4a274268-906c-2988-3087-517b0eae4d76.png)

### 使い所（一言）
インスタンスを無駄に生成せずメモリ消費を抑えたい時

### 利点
- メモリの消費を抑えられる

## Proxy
### クラス図
![proxyClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/abfcd568-f494-8b1d-6ee0-9f17a890b78b.png)

### シーケンス図
![proxySequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/e6a50e17-4c2f-f931-94bd-80992f239294.png)

### 使い所（一言）
本当に必要な時だけインスタンスを生成したい時。その手前は別クラスにやらせる。

### 利点
- proxyを設けることで重たい処理を最後にrealSubjectに行わせるなど遅延させることができる


# 振る舞いに関するパターン
## Iterator
### クラス図
![IteratorClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/d1b82357-5b50-c44b-6c3c-643e1e366ced.png)

### シーケンス図
![IteratorSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/c994946a-c679-08a4-ab43-40bdc2a0628a.png)

### 使い所（一言）
一つのまとまりをくるくる回して操作したい場合に使える！

### 利点
- 次の要素を呼び出したり、反復的な処理を切り出して用いることができる

## TemplateMethod
### クラス図
![templateMethodClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/883fa13c-94d4-4382-2c6f-e95ba24e271f.png)

### シーケンス図
![templateMethodSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/5995f174-e16f-6e91-71ac-1f8825b9b413.png)

### 使い所（一言）
ロジックを共通して定義したい時に使用！

### 利点
- 親クラスに共通ロジックを記載しているので大元のロジックを共有できる！

## Strategy
### クラス図
![strategyClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/a760b332-c93a-fba4-bf56-ffea499f69e7.png)

### シーケンス図
![strategySequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/15686fb6-7d98-5e78-2de1-892808395e38.png)

### 使い所（一言）
戦略など切り替えが発生し得る大きなロジックを含むプログラムを作る時！

### 利点
- ロジックの切り替えを容易に行うことができる

## Visitor
### クラス図
![visitorClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/0d490c87-eaa5-fd3e-a9c6-9a5b88568f4f.png)

### シーケンス図
![visitorSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/fad07c64-1ab6-cb28-589b-fb46c916de07.png)

### 使い所（一言）
データ構造と処理を分離して部品としての独立性を高めたい時

### 利点
- 処理を修正したい時に部品クラスに影響を与えずviditorクラスだけに修正を加えれば良い

## Chain of Responsibility
### クラス図
![chainOfResponsibilityClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/5f0cb104-fe1b-8441-a45d-5333ad174648.png)

### シーケンス図
![chainOfResponsibility.png](https://qiita-image-store.s3.amazonaws.com/0/188761/54567e1b-1426-6453-8d78-e6f2e0890419.png)

### 使い所（一言）
処理をクラス間でたらい回しにしたい時に使う

### 利点
- 処理を実施する各クラスが自分の処理内容だけに専念できる

## Mediator
### クラス図
![meditatorClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/ebd44897-52bf-a9d8-113f-bcbc9ef7a3af.png)

### シーケンス図
![mediatorSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/75024f1e-28ee-c515-a95f-5101938c8e2e.png)

### 使い所（一言）
オブジェクト間の複雑な関連を一つのクラス（相談役）に任せたい時

### 利点
- 各Colleagueの状態をmediator一つで管理できる
- mediatorのcollagueChangedメソッドをみとけば各状態の管理を把握できる

## Observer
### クラス図
![observerClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/6f0849fa-e3db-1a7e-7bba-d1c30f0e4c55.png)

### シーケンス図
![observerSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/17f7c15c-af84-4e4f-2ebe-b1ae1baa5dad.png)

### 使い所（一言）
オブジェクトの状況を外部から観察して通知を受けたら一定の処理を行いたい場合

### 利点
- ロジックと切り離してオブジェクトを観察させ、何か処理を行うことができる

## Memento
### クラス図
![mementoClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/3aee5a63-fc01-3c01-8c0b-48873ce71bd5.png)

### シーケンス図
![mementoSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/cee3ee11-fe2c-ea5f-db72-ddeb23a8fbee.png)

### 使い所（一言）
オブジェクトの状態を保存したり再現したりしたい場合

### 利点
- 直前の状態を保持できる

## State
### クラス図
![stateClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/8197c949-5a3c-bb04-bee0-154ccc383f54.png)

### シーケンス図
![stateSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/c9ab57fb-16d5-aec3-109f-0b1860e600f4.png)

### 使い所（一言）
状態により処理の内容が異なる場合

### 利点
- 状態による違いをif文で記載する必要がない

## Command
### クラス図
![commandClass.png](https://qiita-image-store.s3.amazonaws.com/0/188761/fd8f8a0e-efc1-566c-c467-a06417152c91.png)

### シーケンス図
![commandSequence.png](https://qiita-image-store.s3.amazonaws.com/0/188761/98a5975e-5b20-9219-1208-a0c751802f8d.png)

### 使い所（一言）
実行する処理をメソッドではなくクラス単位で扱いたい時

### 利点
- コマンドの実行を履歴として残したりできる
- マクロとしてコマンドを実行することができる

## Interpreter
### クラス図
![クラス図0.png](https://qiita-image-store.s3.amazonaws.com/0/188761/4bd1d005-0050-df96-82dd-f2d9573f0ae6.png)

### 使い所（一言）
ミニ言語を作成し既存クラスを意図した通りに動かす！

### 利点
- 問題を解決するためにダイレクトな手段を取れる
- 自分の意図した仕様を考え実現するミニ言語を作成する