ファクトリーパターン

ショーン-ブラッドリー
ショーン-ブラッドリー

フォローしている

2019年4月9日•4分読み取り

コードを開発するときは、メソッドまたはクラスでオブジェクトを直接インスタンス化できます。 これは非常に正常ですが、オブジェクトの作成とプロジェクトで使用される場所の間に余分な抽象化を追加することができます。

ファクトリパターンを使用して、その余分な抽象化を追加できます。 ファクトリパターンは、理解して実装するのが最も簡単なパターンの1つです。

余分な抽象化を追加すると、ある種のロジックに基づいてインスタンス化するクラスを動的に選択することもできます。

抽象化の前に、クラスまたはメソッドは具体的なクラスを直接作成します。 ファクトリ抽象化を追加した後、具象クラスは現在のクラス/メソッドの外側に作成され、サブクラスに作成されます。

家を設計するためのアプリケーションを想像してみて、家はすでにデフォルトで床に追加された椅子を持っています。 工場出荷時のパターンを追加することで、ユーザーに異なる椅子を選択するオプションと、実行時にいくつの椅子を選択するかを指定できます。 椅子が開始時にプロジェクトにハードコードされるのではなく、ユーザーは選択するオプションを持つようになりました。

この余分な抽象化を追加することは、余分なオブジェクトをインスタンス化する際の複雑さを、それを使用しているクラスまたはメソッドから非

この分離により、コードの読み取りと文書化が容易になります。

ファクトリパターンは、実際にはオブジェクトの作成とそれが使用される場所の間に余分な抽象化を追加することです。 これは、あなたがより簡単に将来的に拡張することができ、余分なオプションを提供します。

  • 具象作成者:作成者を呼び出すクライアントアプリケーション、クラス、またはメソッド(ファクトリメソッド)。
  • 製品インターフェイス:最終製品/オブジェクトを作成するためにファクトリが必要とする属性とメソッドを記述するインターフェイス。
  • 作成者:ファクトリクラス。 要求されたオブジェクトを返すファクトリメソッドを宣言します。
  • 具体的な製品:工場から返されたオブジェクト。 オブジェクトはProductインターフェイスを実装します。

ファクトリパターンUML図

ソースコード

この概念例では、クライアントはb

という名前のオブジェクトをクライアントに直接作成するのではなく、作成者(ファクトリ)にオブジェクトを要求します。

ファクトリは、要求の属性から何らかのロジックを使用して関連するクラスを検索します。 次に、サブクラスに新しいオブジェクトをインスタンス化するように要求し、それを要求するクライアントへの参照として返します。

./factory/factory_concept.py

"""
The Factory Pattern Concept
https://sbcode.net/python/factory/#factoryfactory_conceptpy
"""from abc import ABCMeta, abstractmethodclass IProduct(metaclass=ABCMeta):
"A Hypothetical Class Interface (Product)" @staticmethod
@abstractmethod
def create_object():
"An abstract interface method"class ConcreteProductA(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductA" def create_object(self):
return selfclass ConcreteProductB(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductB" def create_object(self):
return selfclass ConcreteProductC(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductC" def create_object(self):
return selfclass Creator:
"The Factory Class" @staticmethod
def create_object(some_property):
"A static method to get a concrete product"
if some_property == 'a':
return ConcreteProductA()
if some_property == 'b':
return ConcreteProductB()
if some_property == 'c':
return ConcreteProductC()
return None# The Client
PRODUCT = Creator().create_object('b')
print(PRODUCT.name)

出力

python ./factory/factory_concept.py 
ConcreteProductB

工場パターン概要ビデオ

使用例

工場訪問—Pythonでのデザインパターン(sbcode.net)ファクトリパターンの使用例については。

ユースケースの例は、ユーザーが椅子などの項目のメニューから選択できるユーザーインターフェイスです。

ユーザーには何らかのナビゲーションインターフェイスを使用して選択肢が与えられており、アプリケーションが実際に実行され、ユーザーが使用を開始す

したがって、ユーザーが椅子を選択すると、ファクトリはID、Type、またはその他の属性など、その選択に関連するプロパティを取得し、適切なオブジェクトを返

使用されているファクトリパターンの実世界の例

椅子オブジェクトを返すためにファクトリパターンを使用する実世界の例の非常にグラフィカルな例については、上記のgifを参照してください。 左側のパネルには椅子が含まれており、右側のパネルに椅子をドラッグアンドドロップすると、椅子工場が呼び出されて椅子に戻ります。

ファクトリーパターンユースケースビデオ

概要

  • ファクトリパターンは、最終的なオブジェクトの作成をサブクラスに延期するインターフェイスです。
  • ファクトリパターンは、オブジェクトのインスタンス化とコード内の実際に使用されている場所の間に別のレイヤー/抽象化を挿入することです。
  • 実行時までに何または何個のオブジェクトを作成する必要があるかは不明です。
  • 特定のオブジェクトをサブクラスにインスタンス化する詳細の知識をローカライズして、クライアントが詳細を心配する必要がないようにします。
  • アプリケーションがインポート/参照できる外部フレームワークを作成し、最終的なオブジェクト/製品の作成に関連する詳細の詳細を非表示にします。
  • ファクトリパターンを定義するユニークな要因は、プロジェクトがファクトリが委任したサブクラスにオブジェクトの作成を延期することです。

Pythonでのデザインパターン(Book)

時には、コンピュータの電源を切って本から読みたいだけです。 したがって、このパターンに加えて、他のすべてのGoFパターンは、Pythonの本ASIN B08XLJ8Z2J

のデザインパターンで説明されています