趣旨
駆け出しエンジニアの備忘録の垂れ流し。
※ 出典漏れがあればご指摘ください
出典:
https://yamakatsusan.web.fc2.com/pythonpattern08.html
https://dackdive.hateblo.jp/entry/python-design-pattern/abstract-factory
https://www.oreilly.co.jp/books/9784873117393/
factory methodパターン概要
基底クラス(Creatorクラス)にProductインスタンス生成を行うためのファクトリーメソッド(インスタンスを生成するためのメソッド)を定義するが、その生成処理が複数の複雑な手順となる場合、その手順はサブクラス側に定義する(template methodをインスタンスの生成に応用したもの。)
(createメソッドををdirectorとして別クラスに規定したらbuilderパターンになるのでは?)
クラス図とシーケンス図
wikipediaより引用
実装方針
- Creatorクラスではファクトリーメソッド(create)を実装する。ファクトリーメソッド内で呼ばれる作成手順の規定のみ行う。
- Creatorサブクラスでは作成手順をオーバーライドする。
- ClientではCreatorサブクラスを呼び出し(生成し)、createを呼び出す処理を実装する
- Client側では呼び出すCreaterサブクラスの指定が必要。Creatorサブクラスを決定するメソッドがCreatorクラスにあると便利。
# factory側
class Creator:
def create():
return create_proc1()
@abstractmethod
def create_proc1(self):
pass
@classmethod
def get_creator(cls, some_args):
selected_class = get_class(some_args) # クラスを指定するロジックを記載
return selected_class()
class Creator1(Creator):
def create_proc1(self):
# 実処理を記載
return Product1A(self)
# client側
def main():
creator = Creator.get_creator(choose_some_keywords_for_selecting_cls)
product_1 = creator.create()
abstract factoryと factory methodの違い
違いがよくわからなくなったのでしらべてみた
Factory MethodパターンとAbstract Factoryパターンの2つの違い
- 生成するProductインスタンスの数(部品の数)が異なる(Abstract Factoryは複数の生成を考えやすい)
- Abstract Factoryではインスタンスの生成をサブクラスが行い、Factory Methodでは基底クラスが行う。
- Abstract Factoryでは1つのFactoryですべての部品を作るようなイメージ、Factory Methodは1つの部品に1つのFactoryで対応するイメージ
- 個人的には、生成Productインスタンスが1つ、かつ、生成処理が複雑ならFactory methodを使うほうが、実装回数が減るので採用したい。それ以外の場合であれば、Abstract Factoryのほうが可読性が高そうな気もする。(コードをたどる際、毎回Factory methodを基底クラスまで見に行く必要があるので)。インスタンスの生成方法が頻繁に変更される可能性がある場合は、最悪createメソッドのオーバーライドで無理やり変えられるのでFactory methodがいい....?
メリットと使い所
- メリット(Abstract Factoryと一緒)
- インスタンス生成のロジックが、clientコードに依存しない(インターフェースに依存する)。
- 作り方、作るもの、実際に作る、を別のモジュールに実装できる
- 使い所
- 生成方法がほぼ共通の場合に効果がある
- 生成Productインスタンスが1つ、かつ、生成処理が複雑なとき
・クラスが,生成しなければならないオブジェクトのクラスを事前に知ることができない場合。
・サブクラス化により,生成するオブジェクトを特定化する場合。
・クラスが責任をいくつかのサブクラスの中の1つに委譲するときに,どのサブクラスに委譲するのかに関する知識を局所化したい場合。
引用元:https://yamakatsusan.web.fc2.com/pythonpattern04.html