
프로토타입 패턴은 생성자의 복잡한 과정을 생략하고, 기존 객체를 복제하여 새로운 객체를 생성하는 패턴이다. 이를 통해 객체를 생성하는 데 드는 비용을 줄일 수 있으며, 객체 생성의 유연성을 높일 수 있다.
프로토타입 패턴에서는 기존 객체를 복제하는 데 사용할 프로토타입(Prototype) 객체를 정의하고, 이를 복제하여 새로운 객체를 생성하게 된다. 이 때, 필요에 따라 얕은 복제(Shallow Copy)나 깊은 복제(Deep Copy)를 사용할 수 있다.
파이썬에서는 객체를 복제하는 데 copy 모듈을 사용할 수 있으며 copy 모듈에서는 얕은 복제를 수행하는 copy() 함수와 깊은 복제를 수행하는 deepcopy() 함수를 제공한다.
import copy
class Character:
def __init__(self, name, health, damage):
self.name = name
self.health = health
self.damage = damage
def __str__(self):
return f"{self.name} ({self.health} HP, {self.damage} DMG)"
def clone(self):
return copy.deepcopy(self)
class Mage(Character):
def __init__(self, name, health, damage, mana):
super().__init__(name, health, damage)
self.mana = mana
def __str__(self):
return f"{super().__str__()}, {self.mana} MP"
class Warrior(Character):
def __init__(self, name, health, damage, rage):
super().__init__(name, health, damage)
self.rage = rage
def __str__(self):
return f"{super().__str__()}, {self.rage} Rage"
mage1 = Mage("Gandalf", 100, 10, 50)
print(mage1)
mage2 = mage1.clone()
print(mage2)
warrior1 = Warrior("Conan", 150, 15, 0)
print(warrior1)
warrior2 = warrior1.clone()
warrior2.name = "Grady"
print(warrior2)