目录
工厂设计模式的实现是一个不属于任何类的单一函数,负责单一种类对象的创建。
一. 简单工厂模式
本质
给一个函数传递不同的参数,生成不同的对象
优点
- 隐藏了实现细节;
- 调用者不需要修改
缺点
违反了开闭原则,当新增对象类型时必须修改工厂函数代码
代码示例:
'''简单工厂模式'''
class ChinaGetter:
def __init__(self):
self.trans = dict(dog='狗狗',cat = "猫咪")
def get(self,m):
try:
return self.trans[m]
except KeyError:
return str(m)
class EnglishGetter():
def get(self,m):
return str(m)
def get_localizer(language="English"):
'''工厂方法'''
if language=="English":
return EnglishGetter()
elif language=="China":
return ChinaGetter()
else:
return EnglishGetter()
e,c = get_localizer(),get_localizer('China')
for msgid in "dog parrot cat bear".split():
print(e.get(msgid), c.get(msgid))
二.抽象工厂模式
本质
给一个工厂类,设定工厂类中的变量为某个具体的工厂类实例,通过此方式实现不同实例的创建
优点
- 每个具体产品都对应一个具体工厂类,不需要修改工厂类代码
- 隐藏了实现细节
缺点
- 每增加一个类就需要增加相应的工厂类
代码示例
class PetShop():
'''a pet shop'''
def __init__(self,animal_factory=None):
'''抽象工厂'''
self.pet_factory = animal_factory
def show_pet(self):
'''创建宠物并显示'''
pet = self.pet_factory.get_pet()
print('This is a lovely',str(pet))
print('It say',pet.speak())
print('It eats',self.pet_factory.get_food())
class Dog():
def speak(self):
return 'woof'
def __str__(self):
return 'Dog'
class Cat():
def speak(self):
return 'miaomiao'
def __str__(self):
return 'Cat'
class DogFactory():
'''狗工厂'''
def get_pet(self):
return Dog()
def get_food(self):
return 'Dog food'
class CatFactory():
'''猫工厂'''
def get_pet(self):
return Cat()
def get_food(self):
return 'Cat food'
def get_factory(className):
'''根据传入的类对象生成相应的实例'''
return className()
if __name__ == "__main__":
f1 = get_factory(DogFactory)
shop = PetShop(f1)
shop.show_pet()
f2 = get_factory(CatFactory)
shop = PetShop(f2)
shop.show_pet()
三.参考连接:
http://www.pythonav.com/xiaofeng/4.html#_label3_4
https://www.jianshu.com/p/42f6cbd29e76