[디자인 패턴] 프로토타입 패턴

프로토타입 패턴은 오브젝트 생성 비용이 높을 때 기존 오브젝트를 복제하여 새로운 오브젝트를 생성하는 패턴입니다. 이렇게 하면 개체 생성 비용을 줄일 수 있습니다.

1. 필요한 상황

1) 객체 생성에 많은 리소스가 필요한 경우
2) 생성된 객체의 종류가 다른 경우
3) 객체 생성 과정이 복잡한 경우

두 번째 예

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. 단점

복잡한 개체 상태가 있는 경우 복제를 위한 추가 구현이 필요합니다. 복제된 개체를 사용하는 경우 여러 개체가 동일한 상태를 공유하므로 개체의 상태를 변경할 때 주의하십시오. 복제된 개체를 다시 복제하려면 전체 복사본을 만들어야 하므로 성능 문제가 발생할 수 있습니다. 따라서 프로토타입 패턴은 객체 생성 비용이 높거나 객체 생성 과정이 복잡할 때 유용하다. 그러나 객체의 상태가 복잡한 경우 복제를 위한 추가 구현이 필요하며 성능 문제도 고려해야 합니다.