공장 패턴

숀 브래들리
숀 브래들리

팔로우

2019 년 4 월 9 일·4 분 읽기

코드를 개발할 때 메서드 또는 클래스에서 개체를 직접 인스턴스화 할 수 있습니다. 이것은 아주 정상적인 동안,당신은 객체의 생성 및 프로젝트에서 사용되는 위치 사이에 추가 추상화를 추가 할 수 있습니다.

팩토리 패턴을 사용하여 추가 추상화를 추가 할 수 있습니다. 팩토리 패턴은 이해하고 구현하는 가장 쉬운 패턴 중 하나입니다.

추가 추상화를 추가하면 어떤 종류의 논리를 기반으로 인스턴스화 할 클래스를 동적으로 선택할 수도 있습니다.

추상화 전에 클래스 또는 메서드가 구체적인 클래스를 직접 만듭니다. 팩토리 추상화를 추가 한 후 콘크리트 클래스는 현재 클래스/메소드 외부에서 생성되며 이제 하위 클래스에 생성됩니다.

주택을 설계하는 응용 프로그램을 상상해 보면 집은 기본적으로 바닥에 의자가 이미 추가되었습니다. 공장 패턴을 추가하여,당신은 다른 의자를 선택하는 사용자에게 옵션을 제공 할 수 있고,얼마나 많은 런타임에. 의자가 시작되었을 때 프로젝트에 하드 코딩되는 대신 사용자는 이제 선택할 수있는 옵션을 갖게됩니다.

이 추가 추상화를 추가하면 추가 개체를 인스턴스화하는 합병증이 이제 해당 개체를 사용하는 클래스 또는 메서드에서 숨길 수 있음을 의미합니다.

이 분리는 또한 코드를 읽고 문서화하기가 더 쉽습니다.

팩토리 패턴은 객체 생성과 그것이 사용되는 곳 사이에 여분의 추상화를 추가하는 것에 관한 것입니다. 이것은 당신에게 당신이 더 쉽게 미래에 확장 할 수있는 추가 옵션을 제공합니다.

  • 구체적인 작성자:작성자(팩토리 메서드)를 호출하는 클라이언트 응용 프로그램,클래스 또는 메서드입니다.
  • 제품 인터페이스:공장에서 최종 제품/개체를 만들기 위해 필요한 속성과 방법을 설명하는 인터페이스입니다.
  • 작성자:공장 클래스. 요청된 개체를 반환할 팩터리 메서드를 선언합니다.
  • 콘크리트 제품:공장에서 반환 된 물건. 개체는 제품 인터페이스를 구현합니다.

소스 코드

이 개념 예에서 클라이언트는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

공장 패턴 개요 비디오

예제 사용 사례

파이썬에서 팩토리 디자인 패턴 방문(sbcode.net)공장 패턴의 예제 사용 사례.

예제 사용 사례는 사용자가 의자와 같은 항목 메뉴에서 선택할 수 있는 사용자 인터페이스입니다.

사용자에게 어떤 종류의 탐색 인터페이스를 사용하여 선택권이 주어졌으며 응용 프로그램이 실제로 실행되고 사용자가 응용 프로그램을 사용하기 시작할 때까지 어떤 선택 또는 사용자 수를 만들지는 알 수 없습니다.

따라서 사용자가 의자를 선택하면 팩토리는 아이디,유형 또는 기타 속성과 같은 선택과 관련된 일부 속성을 취한 다음 적절한 개체를 반환하기 위해 인스턴스화 할 관련 하위 클래스를 결정합니다.

사용 중인 공장 패턴의 실제 예

공장 패턴을 사용하여 의자 개체를 반환하는 실제 예제의 매우 그래픽적인 예는 위의 지프를 참조하십시오. 왼쪽의 패널에는 의자가 있고,오른쪽의 패널로 의자를 끌어서 놓으면 의자 팩토리를 호출하여 의자를 의자로 되돌립니다.

팩토리 패턴 사용 사례 비디오

요약

  • 팩토리 패턴은 하위 클래스에 대한 최종 객체 생성을 지연시키는 인터페이스입니다.
  • 팩토리 패턴은 객체를 인스턴스화하고 코드에서 실제로 사용되는 위치 사이에 다른 레이어/추상화를 삽입하는 것입니다.
  • 런타임까지 생성해야 할 개체 또는 개체 수를 알 수 없습니다.
  • 클라이언트가 세부 사항에 대해 걱정할 필요가 없도록 특정 개체를 하위 클래스에 인스턴스화하는 세부 사항에 대한 지식을 지역화하려고합니다.
  • 당신은 외부 프레임 워크를 만들,응용 프로그램이 가져올 수있는/참조,최종 객체/제품을 만드는 관련된 세부 사항의 세부 사항을 숨기기.
  • 팩토리 패턴을 정의하는 고유한 요소는 프로젝트가 이제 팩토리가 위임한 하위 클래스에 개체 생성을 지연한다는 것입니다.

파이썬 디자인 패턴(책)

때때로 당신은 당신의 컴퓨터를 끄고 책에서 읽고 싶어. 그래서,이 패턴과 다른 모든 패턴은 파이썬 책의 내 디자인 패턴에서 논의됩니다.