소프트웨어에 대한 모든 것

[디자인패턴][Factory Method] 팩토리 메소드 패턴 본문

시스템 설계 및 디자인/디자인 패턴

[디자인패턴][Factory Method] 팩토리 메소드 패턴

앤테바 2022. 3. 24. 13:46
반응형

팩토리 메소드 패턴 정의

팩토리 메소드는 가장 널리 사용되는 생성 패턴 중 하나입니다. '공장' 즉 객체를 생산하는 패턴인데 객체를 만들어 내는 부분을 서브 클래스에 위임하는 패턴이라고 할 수 있습니다.

 

팩토리 메소드는 객체 생성을 처리하며, 팩토리 메소드를 이용하면 객체를 생성하는 작업을 서브클래스에 캡슐화시킬 수 있습니다. 이렇게 하면 슈퍼클래스에 있는 클라이언트 코드와 서브클래스에 있는 객체 생성 코드를 분리시킬 수 있습니다.(by 헤드퍼스트 디자인패턴)

 

구상(Concrete) 형식의 인스턴스를 만드는 작업을 캡슐화

 

 

 

팩토리 메소드 패턴 클래스 다이어그램

Factory Method 패턴 Class Diagram

팩토리 메소드 패턴 활용

빌딩 클래스가 있고, 빌딩은 유럽 스타일, 한국 스타일로 지어질 수 있습니다. 빌딩 클래스를 상속 받아서 병원 건물과 대학 건물을 지을 수 있습니다. 건설사 추상 클래스가 있고 유럽건설사와 한국건설사 있습니다. 유럽 건설사는 유럽스타일병원, 유럽스타일대학을 짓고 한국 건설사는 한국스타일병원, 한국스타일대학을 건설할 수 있습니다.

from abc import ABC, abstractmethod


class ConstructionFirm(ABC):
    """
    건설사 추상 클래스
    """
    def __init__(self):
        self.name == None

    @abstractmethod
    def create(self, type):
        pass

class EuropeConstructionFirm(ConstructionFirm):
    def __init__(self):
        self.name = "유럽건설사"

    def create(self, building_type):
        if building_type == "병원":
            return EuropeStyleHospitalBuilding()
        elif building_type == "대학":
            return EuropeStyleUniversityBuilding()
        else:
            raise Exception('not supported building type')


class KoreaConstructionFirm(ConstructionFirm):
    def __init__(self):
        self.name = "한국건설사"

    def create(self, building_type):
        if building_type == "병원":
            return KoreaStyleHospitalBuilding()
        elif building_type == "대학":
            return KoreaStyleUniversityBuilding()
        else:
            raise Exception('not supported building type')


class Building(ABC):
    def __init__(self):
        self.name = None


class EuropeStyleHospitalBuilding(Building):
    def __init__(self):
        self.name = "유럽 스타일 병원 빌딩"
        print(f'{self.name} 완공')


class EuropeStyleUniversityBuilding(Building):
    def __init__(self):
        self.name = "유럽 스타일 대학 빌딩"
        print(f'{self.name} 완공')


class KoreaStyleHospitalBuilding(Building):
    def __init__(self):
        self.name = "한국 스타일 병원 빌딩"
        print(f'{self.name} 완공')


class KoreaStyleUniversityBuilding(Building):
    def __init__(self):
        self.name = "한국 스타일 대학 빌딩"
        print(f'{self.name} 완공')


europeConstFirm = EuropeConstructionFirm()
europeConstFirm.create("병원")
europeConstFirm.create("대학")

koreaConstFirm = KoreaConstructionFirm()
koreaConstFirm.create("병원")
koreaConstFirm.create("대학")

출력

유럽 스타일 병원 빌딩 완공
유럽 스타일 대학 빌딩 완공
한국 스타일 병원 빌딩 완공
한국 스타일 대학 빌딩 완공

요약

  • 객체 생성을 한 곳에 모아놓고 체계적 관리
  • 의존성 역전 원칙에 따라 구체적인 것이 아니라 추상적인 것에 의존하는 설계

참고 자료'

 

https://en.wikipedia.org/wiki/Factory_method_pattern

https://im-yeobi.io/posts/design-pattern/factory-pattern-1/

 

 

반응형
Comments