본문 바로가기

설계

[디자인 패턴] 추상 팩토리 패턴 (Abstract Factory Pattern) - python 예제 코드

추상 팩토리 패턴(Abstract Factory Pattern) 은 객체 생성에 관련된 문제를 해결하기 위한 디자인 패턴 중 하나입니다. 이 패턴은 관련성이 있는 여러 개의 객체들을 일관된 방식으로 생성하는 방법을 제공합니다.


1. 추상 팩토리 패턴의 주요 개념


1) 추상 팩토리 (Abstract Factory)


인터페이스를 정의하여 객체 생성을 추상화한 팩토리입니다. 클라이언트는 추상 팩토리를 통해 객체를 생성합니다. 구체적인 팩토리가 이 추상 팩토리를 구현하여 실제 객체 생성을 담당합니다.

2) 구체적인 팩토리 (Concrete Factory)


추상 팩토리를 구현하여 실제 객체 생성을 담당하는 클래스입니다. 구체적인 팩토리는 특정한 객체들을 생성합니다.

3) 추상 제품 (Abstract Product)


팩토리가 생성할 객체들의 공통 인터페이스를 정의합니다. 추상 팩토리는 이 인터페이스를 통해 객체를 생성하고 클라이언트에 반환합니다.

4) 구체적인 제품 (Concrete Product)


추상 제품을 구현한 클래스입니다. 구체적인 팩토리는 이 클래스를 이용하여 객체를 생성합니다.

추상 팩토리 패턴은 관련성 있는 객체들을 함께 생성하므로 객체 간의 일관성을 유지할 수 있습니다. 또한, 추상 팩토리를 이용하면 객체 생성 과정을 변경하더라도 클라이언트 코드 변경을 최소화할 수 있습니다.

2. 예제 코드

동물과 색상에 대한 추상 팩토리를 구현하고, 구체적인 팩토리로 '강아지'와 '고양이'를 생성하고, 이들 동물의 색상으로 '검정색'과 '갈색'을 생성하는 예제입니다.

from abc import ABC, abstractmethod

# 추상 팩토리: 동물과 색상을 생성하는 인터페이스
class AbstractFactory(ABC):
    @abstractmethod
    def create_animal(self):
        pass
    
    @abstractmethod
    def create_color(self):
        pass

# 추상 제품: 동물 클래스
class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

# 추상 제품: 색상 클래스
class Color(ABC):
    @abstractmethod
    def fill(self):
        pass

# 구체적인 제품: 강아지 클래스
class Dog(Animal):
    def speak(self):
        return "멍멍"

# 구체적인 제품: 고양이 클래스
class Cat(Animal):
    def speak(self):
        return "야옹"

# 구체적인 제품: 검정색 클래스
class Black(Color):
    def fill(self):
        return "검정색"

# 구체적인 제품: 갈색 클래스
class Brown(Color):
    def fill(self):
        return "갈색"

# 구체적인 팩토리: 강아지와 검정색을 생성하는 팩토리
class DogBlackFactory(AbstractFactory):
    def create_animal(self):
        return Dog()
    
    def create_color(self):
        return Black()

# 구체적인 팩토리: 고양이와 갈색을 생성하는 팩토리
class CatBrownFactory(AbstractFactory):
    def create_animal(self):
        return Cat()
    
    def create_color(self):
        return Brown()

# 클라이언트
class Client:
    def __init__(self, factory):
        self.animal = factory.create_animal()
        self.color = factory.create_color()
        
    def show(self):
        animal_sound = self.animal.speak()
        color_fill = self.color.fill()
        print(f"{animal_sound} 소리를 내며 {color_fill} 색상을 가진 동물입니다.")

# 클라이언트 코드
dog_black_factory = DogBlackFactory()
cat_brown_factory = CatBrownFactory()

dog_black_client = Client(dog_black_factory)
dog_black_client.show()

cat_brown_client = Client(cat_brown_factory)
cat_brown_client.show()


이 예제에서는 AbstractFactory, Animal, Color 등의 추상 클래스와 Dog, Cat, Black, Brown 등의 구체적인 클래스를 정의합니다. 또한 DogBlackFactory, CatBrownFactory와 같은 구체적인 팩토리를 구현하고, 클라이언트에서는 원하는 팩토리를 선택하여 Client 클래스의 생성자를 호출하고, 생성된 동물과 색상을 이용하여 정보를 출력합니다.

클라이언트는 구체적인 팩토리를 사용하여 Client 객체를 생성하며, 생성자에서는 해당 팩토리를 이용하여 Animal과 Color 객체를 생성합니다. 이후 show 메서드를 호출하여 생성된 동물의 소리와 색상을 출력합니다.

이 예제에서는 DogBlackFactory와 CatBrownFactory를 구현하여 강아지와 검정색, 고양이와 갈색을 생성합니다. 만약에 다른 동물과 색상을 추가하고 싶다면, 각각의 구체적인 팩토리를 구현하고, AbstractFactory에 해당하는 추상 팩토리 클래스에 새로운 추상 메서드를 추가하여 구현하면 됩니다.

추상 팩토리 패턴은 코드의 유연성을 높이며, 관련 있는 객체들을 쉽게 생성할 수 있습니다. 하지만 객체를 생성하는데 불필요한 복잡도를 추가할 수 있기 때문에, 객체의 생성이 비교적 간단한 경우에는 다른 패턴을 사용하는 것이 더 적절할 수 있습니다.