目的
「デザインパターンって何よ」を
元がJavaで記述されている『株式会社テクノロジックアート. 長瀬嘉秀編. 独習デザインパターン. 翔泳社, 2004.』(絶版)をPython3に置き換えていこうと思います。
ちゃうねん。
『Mike Summerfield. 実践Python: Python in Practice. 斎藤康毅訳. オライリー・ジャパン, 2016.』でPythonには無用の長物と化しているパターンも多いって書いてあるのは知っているねんて。
それでも共通言語として中身は知っておきたいよね。
やっていきます。
閑話休題
パターンとは
- パターンは繰り返すものである
- パターンは経験から見つかるものである
- パターンは問題への解答である
- パターンには適材適所がある
- パターンには大小の粒度がある
- パターンは理解の単位である
- パターンは人や自分に伝えるものである
ソフトウェアのパターン
- アーキテクチャパターン
- 抽象度の高い『構造』を指す
- システム全体を決定する
- i.e.) MVCアーキテクチャ
- アナリシスパターン
- ビジネスロジックの『分析』で用いる
- コンピュータのシステムには依存しない
- i.e.) パーティパターン(類似部分をひとまとめと考える)
- デザインパターン
- 『設計』で用いる
- イディオム
- 『製造』で用いる
- 別名:プログラミングパターン
- 特定の言語に特化している
使用関係
アーキテクチャパターン -> アナリシスパターン -> デザインパターン -> イディオム
デザインパターンのメリット
- 共通の語彙を持てる
- メリットとデメリットが洗い出されている
- 設計の考察に便利
- 設計の目標が立てられる
- 問題解決策をくれる
- 適用範囲が広い
- 効率的に良い設計を学べる
デザインパターンの落とし穴
- デザインパターンは思考のサポートツールでしかない
- なんでもかんでもデザインパターンを適用しない
- デザインパターンも変形する
- デザインパターンは組み合わせて使ってもよい
GoF 23パターン
生成 | 構造 | 振舞 | |
---|---|---|---|
クラス | ファクトリメソッド | アダプター(クラス) | インタープリタ |
テンプレートメソッド | |||
オブジェクト | アブストラクトファクトリ | アダプター(オブジェクト) | チェーンオブレスポンシビリティ |
ビルダー | ブリッジ | コマンド | |
プロトタイプ | コンポジット | イテレータ | |
シングルトン | デコレータ | メディエータ | |
ファサード | メメント | ||
フライウェイト | オブザーバ | ||
プロキシ | ステート | ||
ストラテジー | |||
ビジター |
概要
生成
-
Abstract Factory:
- 関連するオブジェクトの生成方法をグループ化する
- 具体的なオブジェクトを特定せずに生成するインターフェース
- Builder:
- オブジェクトの生成処理を担当する
-
Factory Method:
- インターフェースを介することで、直接的に具象クラスを明示してオブジェクト生成を行わなくする
- Prototype:
- サンプルオブジェクトをコピーしてクライアントに提供する
-
Singleton:
- システム内に同オブジェクトが1つしかないことを保証する
構造
- Adapter:
- インターフェースによる変換で、互換性のないクラスを利用する
- Bridge:
- 抽象インターフェースを2つに分解して、自由に変更できるようにする
- Composite:
- 集団と要素それぞれのオブジェクトを同様に扱う
- Decorator:
- オブジェクトへ動的に機能を追加する
- Facade:
- サブシステム用のインターフェースを使って利用を簡単にする
- Flyweight:
- 細粒度のオブジェクトを共有し、オブジェクト格納コストを減らす
- 共有オブジェクトは使用状況に依存しない
- Proxy:
- サーバへアクセスするときに使う
振舞
- Chain of Responsibility:
- クライアントの要求を処理するオブジェクトを繋ぐ
- 繋いだオブジェクトの中から任意のオブジェクトが処理を担当する
- Command:
- クライアントの要求をカプセル化する
- 動作タイミングはわかるが具体的な処理がわからないときに有効
- Interpreter:
- 言語の文法をオブジェクトで表す
- オブジェクトを利用して文を解釈する
- Iterator:
- 集約したオブジェクトの中身にアクセスする統一化された手段
- Mediator:
- オブジェクト間の協調を集中管理する
- オブジェクト同士を疎結合にすることが目的
- Memento:
- カプセル化を侵害しないように内部状態を保存し、あとでその状態に戻せる
- Observer:
- あるオブジェクトが状態を変えたとき、依存するオブジェクトに状態変更を通知する
- State:
- 状態によって異なる振舞いをする状態オブジェクトを作る
- クラス内に状態変化に関する記述が不要となり、処理を任せることができる
- Strategy:
- アルゴリズムの実装をカプセル化し、クライアント側へ影響を与えず変更や交換ができる
- Template Method:
- スーパークラスのメソッドで手順を決めておく
- 実装はサブクラスに任せる
- Visitor:
- クラスの要素は変更せず、新しい操作を定義できる