본문 바로가기

설계

[디자인 패턴] 팩토리 메서드 패턴 (Factory Method Pattern) - python 예제 코드

팩토리 메서드 패턴(Factory Method Pattern)은 객체 생성에 관한 디자인 패턴 중 하나입니다. 이 패턴은 객체 생성을 서브 클래스에게 위임하여 유연하게 객체를 생성하는 것을 목적으로 합니다.

1. 설명

어떤 클래스에서 객체를 생성해야 할 때, 그 클래스가 직접 객체를 생성하는 것이 아니라, 객체 생성을 위한 팩토리 메서드를 제공하여, 서브 클래스에서 해당 메서드를 오버라이드하고 적절한 객체를 생성할 수 있도록 합니다. 이를 통해 클래스의 인스턴스 생성 로직을 별도의 클래스로 분리하고 유연성을 확보할 수 있습니다.

2. 예제코드

Python 코드 예제를 통해 팩토리 메서드 패턴을 이해해보도록 하겠습니다.

예를 들어, 간단한 계산기를 만들어 본다고 가정해봅시다. 계산기에는 덧셈, 뺄셈, 곱셈, 나눗셈 등의 연산이 있을 수 있습니다. 이 때, 각 연산을 처리하는 클래스를 만들고, 팩토리 메서드를 이용하여 객체를 생성하도록 하겠습니다.

# 계산기 연산 처리 클래스
class Operation:
    def operate(self, x, y):
        pass

# 덧셈 연산 클래스
class AddOperation(Operation):
    def operate(self, x, y):
        return x + y

# 뺄셈 연산 클래스
class SubtractOperation(Operation):
    def operate(self, x, y):
        return x - y

# 곱셈 연산 클래스
class MultiplyOperation(Operation):
    def operate(self, x, y):
        return x * y

# 나눗셈 연산 클래스
class DivideOperation(Operation):
    def operate(self, x, y):
        return x / y

# 팩토리 메서드
class OperationFactory:
    @staticmethod
    def create_operation(operator):
        if operator == '+':
            return AddOperation()
        elif operator == '-':
            return SubtractOperation()
        elif operator == '*':
            return MultiplyOperation()
        elif operator == '/':
            return DivideOperation()
        else:
            raise ValueError('Invalid operator')

# 사용 예시
if __name__ == '__main__':
    x = 10
    y = 5

    # 덧셈 연산 객체 생성 및 처리
    add_operation = OperationFactory.create_operation('+')
    result = add_operation.operate(x, y)
    print(f'{x} + {y} = {result}')

    # 나눗셈 연산 객체 생성 및 처리
    divide_operation = OperationFactory.create_operation('/')
    result = divide_operation.operate(x, y)
    print(f'{x} / {y} = {result}')


위 예제에서는 Operation 클래스를 상속하여 각 연산을 처리하는 클래스를 만들었습니다. 그리고 OperationFactory 클래스를 만들어, create_operation 메서드를 통해 연산 객체를 생성합니다. 이 때, 생성될 객체는 인자로 전달되는 연산자에 따라 팩토리 메서드가 호출되어 적절한 객체가 생성됩니다. 이렇게 생성된 객체를 이용하여 계산을 수행하게 됩니다.

위 예제에서는 Operation 클래스를 상속하는 클래스를 만들어 각 연산을 처리했지만, 필요에 따라 Operation 클래스를 추상 클래스로 만들어서 추상 메서드를 정의할 수도 있습니다. 이 경우, 각 연산 처리 클래스는 추상 메서드를 오버라이드하여 자신의 연산 로직을 구현하면 됩니다.

3. 장점과 단점

1) 장점

객체 생성을 서브 클래스에게 위임하여, 클래스의 유연성과 확장성을 높일 수 있습니다. 즉, 새로운 객체를 추가하거나 기존 객체를 변경해도 클래스 구조를 변경하지 않고, 팩토리 메서드만 변경하면 됩니다.
객체 생성 과정을 캡슐화하여, 객체 생성 코드의 중복을 방지하고, 유지보수성을 높일 수 있습니다.
객체 생성 과정이 복잡하거나 다양한 조건에 따라 객체를 생성해야 할 때, 팩토리 메서드 패턴을 사용하면 객체 생성 과정을 캡슐화할 수 있습니다.

2) 단점


팩토리 메서드 패턴을 사용하면 클래스의 개수가 증가하게 되어, 클래스 구조가 복잡해질 수 있습니다.
객체 생성을 위해 별도의 클래스를 만들어야 하기 때문에, 객체 생성 코드가 복잡하지 않거나, 객체 생성이 자주 일어나지 않는 경우에는 불필요한 코드를 추가하게 됩니다.