파이썬의 팩토리 패턴
팩토리 디자인 패턴은 창작 디자인 패턴 카테고리에 속합니다. 생성 디자인 패턴은 개체 생성을 위한 많은 기술을 제공하여 더 많은 코드 재사용성과 유연성을 제공합니다.
팩토리 메소드는 구체적인 클래스를 지정하지 않고 객체를 생성하는 메소드입니다.
단일 부모 클래스(추상 클래스 또는 인터페이스)가 개체의 일반 구조를 정의하고 하위 클래스가 개체를 인스턴스화하는 완전한 구현을 제공하는 방식으로 추상화 및 다형성을 제공합니다.
Python에서 Factory 메서드 구현
다음 코드에서 abc
는 ABCMeta
(추상 클래스 선언) 및 abstractstaticmethod
(추상 정적 메서드 선언)를 가져온 추상 기본 클래스를 나타내는 패키지입니다.
추상 정적 메소드 person_type()
을 갖는 Person
이라는 일반 추상 기본 클래스를 정의했습니다.
구체적인 파생 클래스는 이 메서드를 구현합니다. 그런 다음 Person
에서 Student
및 Teacher
라는 두 개의 파생 클래스를 정의했습니다. 두 클래스 모두 필요에 따라 추상 정적 메서드 person_type()
을 구현합니다.
우리는 사용자의 입력 선택에 따라 실행 시간에 사람(학생 또는 교사)의 객체를 생성하는 책임이 있는 팩토리 메서드 PersonFactory
를 선언했습니다.
이 클래스에는 사람 유형을 인수로 사용하고 이름(학생 이름 또는 교사 이름)으로 필요한 객체를 구성하는 정적 메서드인 build_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에서 Factory 메서드의 장점
- 코드에서
느슨한 결합
을 조장합니다. - 현재 코드를 방해하지 않고 약간 다른 특성을 가진 새로운 개체를 인스턴스화하기 위해 코드를 쉽게 수정할 수 있습니다.
- 코드에서
추상화
및다형성
을 촉진합니다.
Python에서 Factory 메서드의 단점
- 개체가 약간 다른 기능을 가진 동일한 범주에 속하는 경우에만 사용할 수 있습니다.
- 팩토리 디자인 패턴은 코드의 총 클래스 수를 늘립니다.
- 추상화로 인해 구현이 숨겨지기 때문에 코드의
가독성
이 감소합니다.
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