프로토타입 패턴은 기존 객체를 복제하여 새로운 객체를 생성하는 바업이다.
그러나 아래의 경우 클래스로부터 인스턴스를 만드는 것이 아니라 인스턴스를 복사해서 새로운 인스턴스를 만드는 것이 좋다.
여러가지 형태로 출력이 되는 메소드를 만들어보자.
# Prototype
from abc import *
class Product(metaclass = ABCMeta):
@abstractmethod
def use(self):
pass
@abstractmethod
def clone(self):
pass
# Concrete
class UnderlinePen(Product):
def use(self, s:str):
n = len(s)
print(s)
for i in range(n):
print("~", end="")
print()
def clone(self):
return copy.deepcopy(self)
# Concrete 2
class MessageBox(Product):
def __init__(self, deco:str):
self.deco = deco
def use(self, s:str):
n = len(s) + 4
for i in range(n):
print(self.deco, end="")
print()
print(self.deco, s, self.deco)
for i in range(n):
print(self.deco, end="")
print()
def clone(self):
return copy.deepcopy(self)
# Manager
class Manager:
def __init__(self):
self.showcase = {"a":1}
def register(self, name:str, proto:Product):
self.showcase[name] = proto
def create(self, protoName):
p = self.showcase[protoName]
return p.clone()
# Client
manager = Manager()
m1 = MessageBox("*")
m2 = MessageBox("#")
p1 = UnderlinePen()
manager.register("msg*", m1)
manager.register("msg#", m2)
manager.register("pen", p1)
msg1 = manager.create("msg*")
msg2 = manager.create("msg#")
pen = manager.create("pen")
word = "hello"
msg1.use(word)
word = "world"
msg2.use(word)
pen.use(word)