프로토타입 패턴 (Prototype Pattern) 은 객체 생성의 비용이 높은 경우, 기존에 생성된 객체를 복제하여 새로운 객체를 생성하는 패턴입니다. 이를 통해 객체 생성에 대한 비용을 줄일 수 있습니다.
1. 필요한 상황
1) 객체 생성에 필요한 자원이 많은 경우
2) 생성되는 객체의 종류가 다양한 경우
3) 객체 생성 과정이 복잡한 경우
2. 예제
파이썬에서는 객체를 복제하기 위해 copy 모듈을 사용할 수 있습니다. 이를 활용하여 간단한 프로토타입 패턴을 구현해보겠습니다.
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 메서드를 이용해 객체를 복제할 때, 인자로 전달하는 name은 등록된 객체의 이름입니다. attr은 복제된 객체의 속성을 업데이트할 때 사용됩니다.
위 코드에서는 Person 클래스를 프로토타입으로 등록하고, 이를 복제하여 새로운 객체를 생성하는 예제를 보여주었습니다. 이와 같이 복제를 통해 객체를 생성하면, 객체 생성 과정에서 발생하는 비용을 줄일 수 있습니다.
3. 장점
객체를 생성하는 비용이 크거나 복잡한 경우, 객체를 복제하여 새로운 객체를 생성할 수 있으므로 객체 생성에 대한 비용을 줄일 수 있습니다. 객체 생성 과정에서 중복된 코드를 제거할 수 있습니다. 객체의 생성을 추상화하여, 객체 생성 과정에서 발생하는 복잡성을 감소시킬 수 있습니다.
4. 단점
객체의 복잡한 상태를 가지고 있는 경우, 복제를 위해 추가적인 구현이 필요합니다. 복제된 객체를 사용할 때, 객체의 상태를 바꾸는 경우 여러 객체에서 같은 상태를 공유하게 되므로 조심해야 합니다. 복제된 객체를 다시 복제할 때, 깊은 복사(deep copy)가 이루어져야 하므로 성능 문제가 발생할 수 있습니다. 따라서, 프로토타입 패턴은 객체의 생성 비용이 높은 경우나 객체의 생성 과정이 복잡한 경우에 유용합니다. 그러나 객체의 상태가 복잡한 경우 복제를 위한 추가적인 구현이 필요하며, 성능 문제도 고려해야 합니다.
'설계' 카테고리의 다른 글
[디자인 패턴] 어댑터 패턴 (Adapter Pattern) - python 예제 코드 (0) | 2023.03.07 |
---|---|
[디자인 패턴] 싱글턴 패턴 (Singleton Pattern) - python 예제 코드 (0) | 2023.03.06 |
[디자인 패턴] 빌더 패턴 (Builder Pattern) - python 예제 코드 (0) | 2023.03.06 |
[디자인 패턴] 추상 팩토리 패턴 (Abstract Factory Pattern) - python 예제 코드 (0) | 2023.03.06 |
[디자인 패턴] 팩토리 메서드 패턴 (Factory Method Pattern) - python 예제 코드 (0) | 2023.03.06 |