设计模式之:工厂模式

目录

一. 简单工厂模式

本质

优点

缺点

代码示例:

二.抽象工厂模式

本质

优点

缺点

代码示例

参考连接:


工厂设计模式的实现是一个不属于任何类的单一函数,负责单一种类对象的创建。

一. 简单工厂模式

本质

给一个函数传递不同的参数,生成不同的对象

优点

  • 隐藏了实现细节;
  • 调用者不需要修改

缺点

违反了开闭原则,当新增对象类型时必须修改工厂函数代码

代码示例:

'''简单工厂模式'''
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

猜你喜欢

转载自blog.csdn.net/kongsuhongbaby/article/details/84307193
今日推荐