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