トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Python3とデザインパターン

[Python]

Python3とデザインパターン

実践Python3でデザインパターンを学ぶ

  概要

生成に関するデザインパターン

名称 概要 使いどころ
Abstract Factory 任意のFactoryクラスを作りクラスメソッドとして***create()などのメソッドを生やす。引数にクラス名をとる。インスタンス生成は呼び出し側がやる 生成するオブジェクトがある程度グループ化でき、制御構文で分岐を入れると複雑になる時
Builder 任意のBuilderクラスを作り**config()などのメソッドを生やし、変更されたクラスインスタンスを返すようにする。本には載ってないが各メソッドの返り値にselfを設定したほうがよい 複雑なconfigが必要なオブジェクトの生成
Factory Method 文字列やenumを引数にとり、それに対応するクラスを返すものを作る。あんまAbstract Factoryと変わらんような…?(たぶんPythonだから)Abstとの違いはファクトリメソッド側でインスタンスの生成をやるところ 生成するオブジェクトが実行時までわからないので動的に生成したいかつ制御構文で分岐を入れると複雑になる時
Prototype Pythonならcopy.deepcopyでいいんじゃないですか オブジェクトの複製、Pythonでは意義が薄い(動的型付け言語であり、特にテクニック不要だから)
Singleton アプリ上にインスタンスが1つしか存在しないようにする グローバル変数的オブジェクトを使いたい場合

構造に関するデザインパターン

名称 概要 使いどころ
Adaptor 実行の主体になるクラス(Adaptor)はユーザから渡される実装クラスのインスタンスを受け取る。Adaptorは処理の実行を受け取ったインスタンスに任せる。Hadoopのファイル操作などはこのパターンで実装されてると思う。 Hadoop InputFormat/OutputFormat 柔軟なライブラリ/フレームワークを作りたいとき、プラグイン実装を作りたいとき
Bridge
Composite
Decorator
Facade ファケイドではなくファサード。処理方法やライブラリのインターフェースを丸めて使いやすくする。例)zip / gzip / bzipの処理をarchive関数にまとめ、引数や拡張子で処理を分岐する。 ライブラリやアルゴリズムのインターフェースがまちまちで取り回しが効かないとき
Flyweight 辞書型のvalueにリソース情報を仕込み、次回アクセス時にはそれを使う。辞書型のkeyにはリソースを一意に表すものを使う。 リソース等を複数回扱うとき2度目以降をキャッシュするなど
Proxy

振る舞いに関するデザインパターン

名称 概要 使いどころ
Chain of Responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy 処理系のアルゴリズムをひとまとめにしておくこと、実質utilクラスで草 デザパタがわかる人に命名の意図を伝えるとか?PythonやJava8ではlambda式が使えるので処理系が小さければ関数を切り替えることで事足りる。100行とか超えそうならクラスに切り出したほうが良さそうだ
Template Method 抽象クラスで関数名や役割や順序を定義しておき、実装内容はサブクラスに任せる 機能の実装をある程度テンプレート化できる、実装はたぶんpython3のAbstract Base Classesを使えばいいかと。python2は抽象クラスからサブクラスの実装が呼べないとかありそう。処理が抽象クラスと実装クラスを行ったり来たりするので複雑になると思う。
Visitor
お名前: コメント: