(디자인 패턴) 프로토타입 패턴 – Python 샘플 코드

프로토타입 패턴은 객체 생성 비용이 많이 들 때 기존 객체를 복제하여 새로운 객체를 생성하는 패턴입니다.

이렇게 하면 개체 생성 비용이 줄어듭니다.

1. 필요조건

1) 개체를 만들 때 더 많은 리소스가 필요한 경우
2) 다양한 객체를 생성할 때
3) 객체 생성 과정이 복잡한 경우

2. 예시

Python에서는 복사 모듈을 사용하여 개체를 복제할 수 있습니다.

이를 사용하여 간단한 프로토타입 패턴을 구현해 보겠습니다.

import copy

class Prototype:
    def __init__(self):
        self._objects = {}

    def register_object(self, name, obj):
        self._objects(name) = obj

    def unregister_object(self, name):
        del self._objects(name)

    def clone(self, name, **attr):
        obj = copy.deepcopy(self._objects.get(name))
        obj.__dict__.update(attr)
        return obj

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'{self.name} ({self.age})'

if __name__ == '__main__':
    p = Person('John', 25)
    prototype = Prototype()
    prototype.register_object('person', p)

    p1 = prototype.clone('person', age=30)
    print(p1)
    # Output: John (30)

    p2 = prototype.clone('person', name="Mike")
    print(p2)
    # Output: Mike (25)

위의 코드에서 Prototype 클래스는 객체 복제를 위한 기능을 제공합니다.

객체를 등록하려면 register_object 메서드를 사용하고 등록된 객체를 복제하려면 clone 메서드를 사용합니다.

clone 메서드는 copy.deepcopy 함수를 사용하여 객체를 복제하고 복제된 객체의 속성을 업데이트합니다.

Person 클래스는 프로토타입으로 등록할 객체입니다.

이 클래스의 객체를 생성한 후 Prototype 클래스의 register_object 메소드를 사용하여 등록합니다.

clone 방식으로 객체를 복제할 때 인자로 전달되는 이름은 등록된 객체의 이름이다.

attr은 복제된 객체의 속성을 업데이트하는 데 사용됩니다.

위의 코드는 Person 클래스를 프로토타입으로 등록하고 이를 복제하여 새로운 객체를 생성하는 예제입니다.

이와 같이 복사하여 오브젝트를 생성하면 오브젝트 생성 시 발생하는 비용을 줄일 수 있습니다.

2. 장점

객체 생성이 비용이 많이 들거나 복잡한 경우 객체를 복제하여 새 객체를 생성함으로써 객체 생성 비용을 줄일 수 있습니다.

중복 코드는 개체 생성 중에 제거할 수 있습니다.

개체 생성을 추상화하여 개체 생성의 복잡성을 줄일 수 있습니다.

3. 단점

복잡한 개체 상태가 있는 경우 추가 복제 구현이 필요합니다.

복제된 개체를 사용할 때 개체의 상태를 변경하면 여러 개체가 동일한 상태를 공유하므로 주의하십시오. 복제된 개체를 다시 복제할 때 전체 복사본을 만들어야 하므로 성능 문제가 발생합니다.

따라서 프로토타입 패턴은 객체 생성 비용이 많이 들거나 객체 생성 프로세스가 복잡할 때 유용합니다.

그러나 객체의 상태가 복잡할 경우 추가 복제를 구현해야 하며 성능 문제도 고려해야 한다.