Dev/Design Patterns

[Design Pattern] Factory - 팩토리 디자인 패턴

surimi🍥 2021. 11. 20. 13:49
반응형

Factory Design Pattern

가장 기초적인 디자인 패턴.

객체를 찍어내는 공장.

이 공장은 함수로도, 클래스 객체로도 만들어 낼 수 있다.

# 팩토리 패턴 예시

  • Animal객체를 상속받는 Cat, Dog 클래스

      class Animal():
          def speak(self):
              pass
    
      class Cat(Animal):
          def speak(self):
              print("Meow!")
    
      class Dog(Animal):
          def speak(self):
              print("Baww!")
  • 팩토리 함수

      # argument로 들어오는 요청에 따라 적절한 Animal객체를 만들어 반환.
      def FactoryFun(animal: str) -> Animal:
          # argument로 string을 받고 있지만, 실제 코드에선 enum이 권장됨.
          # argument에 따라 요청된 객체를 만들어준다.
          if animal == "Cat":
              return Cat()
          elif animal == "Dog":
              return Dog()
    
      cat = FactoryFun("Cat")
      cat.speak() # meow!
      dog = FactoryFun("Dog")
      dog.speak() # Baww!
  • 팩토리 객체

      class AnimalFactory():
          # enum prefered
          def createAnimal(self, animal: str) -> Animal:
              if animal == "Cat":
                  return Cat()
              elif animal == "Dog":
                  return Dog()
    
      factory = AnimalFactory()
      cat = factory.createAnimal("Cat")
      dog = factory.createAnimal("Dog")
      cat.speak() # Meow!
      dog.speak() # Baww!

# 팩토리 디자인 패턴의 장점

복잡한 오브젝트의 생성 과정을 클라이언트가 직접 다룰 필요가 없다.

오브젝트의 복잡한 생성 과정을 팩토리 객체/함수 안에 담아놓고 클라이언트는 간단하게 위 코드에서 Cat 객체를 요청하듯 필요한 정보를 팩토리에 넘겨주기만 하면 팩토리는 필요한 객체를 만들어 리턴해준다.

팩토리 패턴은 이후,

등에서 응용된다.

# enum을 사용한 코드

from enum import Enum

class AnimalEnum(Enum):
    CAT = 1
    DOG = 2

class Animal():
    def speak(self):
        pass

class Cat(Animal):
    def speak(self):
        print("meow")

class Dog(Animal):
    def speak(self):
        print("bark")

# Factory function
# prefer enum
def FactoryFn(animal: AnimalEnum):
    if animal == AnimalEnum.CAT:
        return Cat()
    elif animal == AnimalEnum.DOG:
        return Dog()


cat = FactoryFn(AnimalEnum.CAT)
cat.speak()
dog = FactoryFn(AnimalEnum.DOG)
dog.speak()

# Factory class
class AnimalFactory():
    def createAnimal(self, animal):
        if animal == AnimalEnum.CAT:
            return Cat()
        elif animal == AnimalEnum.DOG:
            return Dog()

animal_factory = AnimalFactory()
cat = animal_factory.createAnimal(AnimalEnum.CAT)
cat.speak()
dog = animal_factory.createAnimal(AnimalEnum.DOG)
dog.speak()

# 참조 링크

Youtube link

Singleton Design pattern


반응형

'Dev > Design Patterns' 카테고리의 다른 글

[Design pattern] Singleton - 싱글톤 디자인 패턴  (0) 2021.11.18