from abc import *
import copy
class Product(metaclass = ABCMeta):
@abstractmethod
def use(self):
pass
@abstractmethod
def clone(self):
pass
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)
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)
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()
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)
单例模式:
class Product(metaclass = ABCMeta):
__instance=None
def __init__(self):
pass
def __new__(self, *args, **kwargs):
if Product.__instance is None:
Product.__instance=object.__new__(self)
return Product.__instance
正常的输出结果为:
*********
* hello *
*********
#########
# world #
#########
world ~~~~~
单例模式输出结果:
#########
# hello #
#########
#########
# world #
#########
#########
# world #
#########
程序走单例模式后,输出样式被指定为#