나는 이렇게 본다/파이썬 디자인 패턴

심플 팩토리 패턴

daco2020 2022. 5. 27. 19:36
반응형

팩토리 패턴 개요

  • 팩토리란, 다른 클래스의 객체를 생성하는 클래스를 일컫는다.
  • 클라이언트는 특정 ‘인자’와 함께 ‘메서드’를 호출하고 팩토리는 해당 객체를 생성하고 반환한다.

 

  • 직접 객체를 생성하지 않고 팩토리를 사용하는 이유
    • 객체 생성과 클래스 구현을 나눠 상호 의존도를 줄이기 위함.
    • 클라이언트는 인터페이스와 메소드, 인자 등의 정보만 있으면 된다.
    • 코드를 수정하지 않고 팩토리에 새로운 클래스를 추가할 수 있다.
    • 이미 생성된 객체를 팩토리가 재활용할 수 있다.

 

  • 팩토리 패턴 3가지 종류
    • 심플 팩토리 패턴 - 인터페이스는 객체 생성 로직을 숨기고 객체를 생성
    • 팩토리 메소드 패턴 - 인터페이스를 통해 객체를 생성하지만 서브 클래스가 객체 생성에 필요한 클래스를 선택
    • 추상 팩토리 패턴 - 객체 생성에 필요한 클래스를 노출하지 않고 객체 생성, 내부적으로 다른 팩토리 객체 생성

 

 

 

심플 팩토리 패턴

  • 여러 종류의 객체를 사용자가 직접 클래스를 호출하지 않고 생성할 수 있다.
  • 아래는 팩토리 패턴을 통해 원하는 객체를 생성하는 구현 코드이다.
from abc import ABCMeta, abstractmethod

class Animal(metaclass = ABCMeta):
    @abstractmethod
    def do_say(self):
        pass

class Dog(Animal):
    def do_say(self):
        print("Warl Warl!!")

class Cat(Animal):
    def do_say(self):
        print("Meow Meow!!")


## 팩토리 클래스
# Dog, Cat 문자열이 eval를 통해 Dog, Cat 클래스를 실행한다.
class AnimalFactory(object):
    def make_sound(self, object_type): 
        return eval(object_type)().do_say() 


## 클라이언트 코드
if __name__ == '__main__':
    factory = AnimalFactory()
    animal = input("어떤 동물을 선택하시겠습니까? (Dog or Cat)")
    factory.make_sound(animal)


"""
결과값 1.
어떤 동물을 선택하시겠습니까? (Dog or Cat)Cat
Meow Meow!!

결과값 2.
어떤 동물을 선택하시겠습니까? (Dog or Cat)Dog
Warl Warl!!
"""

 

 

 

 

*eval 함수에 대한 사용법은 아래 링크를 참고해주세요.

 

[Python] 문자열을 코드로 (eval, exec 사용법)

파이썬을 사용하다 보면, 변수에 값을 동적으로 할당하고 싶을 때가 있습니다. 쉽게 말해, 파이썬의 문자열을 변수처럼 사용할 수 있다면, 자유롭게 값을 할당하고 다룰 수 있는 경우들이 있습

bio-info.tistory.com

 

 

 

반응형