import copy
class Cat:
def __init__(self):
self.color = None
self.eye_color = None
self.nose_color = None
self.tail_color = None
self.name = None
def clone(self):
return copy.deepcopy(self)
프로토타입 패턴은 완전히 일치하는 복제 객체를 만들고 싶을 때
복제하고 싶은 객체의 상태를 가지고 있는 패턴이다.
kitty = Cat()
kitty.color = 'white'
kitty.eye_color = 'white'
kitty.nose_color = 'white'
kitty.tail_color = 'white'
kitty.name = 'kitty'
nabi = Cat()
nabi.color = 'white'
nabi.eye_color = 'white'
nabi.nose_color = 'white'
nabi.tail_color = 'white'
nabi.name = 'nabi'
reference기반 언어들은 객체가 reference로 동작하기 때문에
nabi = kitty처럼 쓰면 객체가 복사가 되는 것이 아니라
하나의 객체를 가리키는 reference가 2개가 되는 것일 뿐이다.
따라서 위와같이 clone() 메서드를 지원해주는 방법이다.
#abstract structure prototype
class BlackCat(Cat):
def __init__(self):
super().__init__()
self.color = 'black'
class WhiteCat(Cat):
def __init__(self):
super().__init__()
self.color = 'white'
black_cat = BlackCat()
black_cat.nose_color = 'pink'
black_cat.tail_color = 'green'
#black_cat is prototype
kitty = black_cat.clone()
kitty.eye_color = 'white'
kitty.name = 'kitty'
nabi = black_cat.clone()
nabi.eye_color = 'blue'
nabi.name = 'nabi'
위 코드는
color가 black인 BlackCat 프로토타입을 복사하여 눈 색과 이름을 변경하는 예이다