Python のファクトリー パターン
工場設計パターンは、創造設計パターンのカテゴリに属します。 作成設計パターンは、コードの再利用性と柔軟性を向上させるオブジェクト作成のための多くの手法を提供します。
ファクトリ メソッドは、具象クラスを指定せずにオブジェクトを作成するメソッドです。
単一の親クラス (抽象クラスまたはインターフェイス) がオブジェクトの一般的な構造を定義し、サブクラスがオブジェクトをインスタンス化するための完全な実装を提供するという方法で、抽象化と ポリモーフィズム を提供します。
Python でファクトリ メソッドを実装する
次のコードでは、abc
は、ABCMeta
(抽象クラスを宣言するため) と abstractstaticmethod
(抽象静的メソッドを宣言するため) をインポートした抽象基本クラスを表すパッケージです。
抽象静的メソッド person_type()
を持つ、Person
という名前の一般的な抽象基本クラスを定義しました。
具体的な派生クラスは、このメソッドを実装します。 次に、Person
から Student
と Teacher
という名前の 2つの派生クラスを定義しました。 どちらのクラスも、必要に応じて抽象静的メソッド person_type()
を実装しています。
ユーザーの入力選択に応じて実行時に Person (Student または Teacher) のオブジェクトを作成するファクトリ メソッド PersonFactory
を宣言しました。
このクラスには静的メソッド build_person()
があります。このメソッドは person 型を引数として取り、名前 (生徒の名前または教師の名前) で必要なオブジェクトを構築します。
コード例:
# Python 3.x
from abc import ABCMeta, abstractstaticmethod
class Person(metaclass=ABCMeta):
@abstractstaticmethod
def person_type():
pass
class Student(Person):
def __init__(self, name):
self.name = name
print("Student Created:", name)
def person_type(self):
print("Student")
class Teacher(Person):
def __init__(self, name):
self.name = name
print("Teacher Created:", name)
def person_type(self):
print("Teacher")
class PersonFactory:
@staticmethod
def build_person(person_type):
if person_type == "Student":
name = input("Enter Student's name: ")
return Student(name)
if person_type == "Teacher":
name = input("Enter Teacher's name: ")
return Teacher(name)
if __name__ == "__main__":
choice = input("Enter the Person type to create: ")
obj = PersonFactory.build_person(choice)
obj.person_type()
出力:
#Python 3.x
Enter the Person type to create: Teacher
Enter Teacher's name: Jhon
Teacher Created: Jhon
Teacher
Python でのファクトリ メソッドの利点
- コード内の
疎結合
を促進します。 - コードを変更して、現在のコードを乱すことなく、わずかに異なる特性を持つ新しいオブジェクトをインスタンス化するのは簡単です。
- コードの
抽象化
とポリモーフィズム
を促進します。
Python でのファクトリ メソッドの欠点
- オブジェクトがわずかに異なる機能を持つ同じカテゴリに属している場合にのみ使用できます。
- ファクトリ デザイン パターンにより、コード内のクラスの総数が増加します。
- 抽象化により実装が隠されているため、コードの
読みやすさ
が低下します。
I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.
LinkedIn