简单工厂模式:
优点:方便调用,隐藏底层参数
缺点:每次添加新功能时,需要修改服务端(底层或者被调用者)的原代码
违反了,一个接口只负责一个类
from abc import ABCMeta, abstractmethod
# 1个接口
# 抽象一个类,让其继承者必须以它为准,必须写这个方法:名称、参数、返回值、都要相同,方便高层调用
# 一个接口只负责一个类,只负责一种功能, 使其不会混乱,增加新功能时节省代码量
# 动物
class Creature(metaclass=ABCMeta):
@abstractmethod
def Go(self, name):
pass
# 鸟
class Bird(Creature):
def Go(self, name):
print(name, "鸟")
# 灰熊
class Silvertip(Creature):
def Go(self, name):
print(name, "熊")
# 狗
class Dog(Creature):
# 简单工厂:
# 在复杂系统中,输入不同参数,返回的结果也不一样.
# 优点:隐藏底层代码, 无需修改高层(客户端或者调用者)的代码
# 让高层不需要知道底层的参数都需要什么就可以直接调用
def __init__(self, sleuth=False):
self.sleuth = sleuth
def Go(self, name):
if self.sleuth:
print(name, "猎犬")
else:
print(name, "狗")
class Zoo():
# 简单工厂:
# 缺点:每次增加新"类型"都要修改原代码
def zoological_park(self, creature):
if creature == "Bird":
return Bird()
elif creature == "Silvertip":
return Silvertip()
elif creature == "Dog":
return Dog()
elif creature == "sleuth":
return Dog(sleuth=True)
else:
# 报错:没有这种类型
raise TypeError("There is no such type")
if __name__ == '__main__':
pf = Zoo()
p = pf.zoological_park("sleuth")
p.Go("小黑")