デザインパターン,
GoF,

概要

ずっと気になっていたデザインパターンを勉強したのでメモ。
「Java言語で学ぶデザインパターン入門」を購入して自分なりの言葉で理解をまとめる

生成に関するパターン

FactoryMethod

クラス図

class_factory_method.png

シーケンス図

FactoryMethodSequence.png

使い所(一言)

  • インスタンス生成を別出しにしてまとめたいとき

利点

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

  • IDCardの生成

Abstract factory

クラス図

AbstractFactory.png

シーケンス図

AbstractFactorySequence.png

使い所(一言)

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

利点

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

  • HTML内のリンクの生成やテーブルの作成

builder

クラス図

builder_class.png

シーケンス図

builder_sequence.png

使い所(一言)

呼び出し元から1つのメソッドでまとまった何かを生成したい!まとまった何かはカチカチっと入れ替え可能!

利点

  • まとまった何か(クラス)の切り替えが容易に行える

  • TEXT形式やHTML形式で文章を生成

Singleton

クラス図

SingletonClass.png

シーケンス図

SingletonSequence.png

使い所(一言)

インスタンスを1つしか生成したくない場合

利点

  • インスタンスが一つであることが担保される

Prototype

クラス図

PrototypeClass.png

シーケンス図

PrototypeSequence.png

使い所(一言)

毎回インスタンス(オブジェクト)を生成するのは適さないものを複製する!

利点

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

構造に関するパターン

Adapter

クラス図

AdapterClass.png

シーケンス図

AdapterSequence.png

使い所(一言)

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

利点

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

Bridge

クラス図

brindgeClass.png

シーケンス図

bridgeSequence.png

使い所(一言)

「機能」と「実装」を別クラスで実装したい時

利点

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

Composite

クラス図

CompositeClass.png

シーケンス図

CompositeSequence.png

使い所(一言)

複数のクラスを単一のものと見ることで同一処理を再帰的に行いたいとき!

利点

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

Decorator

クラス図

DecoratorClass.png

シーケンス図

DecoratorSequence.png

使い所(一言)

既存機能を様々な種類で装飾(拡張)したい時!

利点

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

Facade

クラス図

FacadeClass.png

使い所(一言)

複雑な処理を簡単な窓口(API)から利用させたい時

利点

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

Flyweight

クラス図

FlyweightClass.png

シーケンス図

flyweightSequence.png

使い所(一言)

インスタンスを無駄に生成せずメモリ消費を抑えたい時

利点

  • メモリの消費を抑えられる

Proxy

クラス図

proxyClass.png

シーケンス図

proxySequence.png

使い所(一言)

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

利点

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

振る舞いに関するパターン

Iterator

クラス図

IteratorClass.png

シーケンス図

IteratorSequence.png

使い所(一言)

一つのまとまりをくるくる回して操作したい場合に使える!

利点

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

TemplateMethod

クラス図

templateMethodClass.png

シーケンス図

templateMethodSequence.png

使い所(一言)

ロジックを共通して定義したい時に使用!

利点

  • 親クラスに共通ロジックを記載しているので大元のロジックを共有できる!

Strategy

クラス図

strategyClass.png

シーケンス図

strategySequence.png

使い所(一言)

戦略など切り替えが発生し得る大きなロジックを含むプログラムを作る時!

利点

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

Visitor

クラス図

visitorClass.png

シーケンス図

visitorSequence.png

使い所(一言)

データ構造と処理を分離して部品としての独立性を高めたい時

利点

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

Chain of Responsibility

クラス図

chainOfResponsibilityClass.png

シーケンス図

chainOfResponsibility.png

使い所(一言)

処理をクラス間でたらい回しにしたい時に使う

利点

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

Mediator

クラス図

meditatorClass.png

シーケンス図

mediatorSequence.png

使い所(一言)

オブジェクト間の複雑な関連を一つのクラス(相談役)に任せたい時

利点

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

Observer

クラス図

observerClass.png

シーケンス図

observerSequence.png

使い所(一言)

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

利点

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

Memento

クラス図

mementoClass.png

シーケンス図

mementoSequence.png

使い所(一言)

オブジェクトの状態を保存したり再現したりしたい場合

利点

  • 直前の状態を保持できる

State

クラス図

stateClass.png

シーケンス図

stateSequence.png

使い所(一言)

状態により処理の内容が異なる場合

利点

  • 状態による違いをif文で記載する必要がない

Command

クラス図

commandClass.png

シーケンス図

commandSequence.png

使い所(一言)

実行する処理をメソッドではなくクラス単位で扱いたい時

利点

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

Interpreter

クラス図

クラス図0.png

使い所(一言)

ミニ言語を作成し既存クラスを意図した通りに動かす!

利点

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