1. 程式人生 > >設計模式之:工廠模式

設計模式之:工廠模式

目錄

一. 簡單工廠模式

本質

優點

缺點

程式碼示例:

二.抽象工廠模式

本質

優點

缺點

程式碼示例

參考連線:


工廠設計模式的實現是一個不屬於任何類的單一函式,負責單一種類物件的建立。

一. 簡單工廠模式

本質

給一個函式傳遞不同的引數,生成不同的物件

優點

  • 隱藏了實現細節;
  • 呼叫者不需要修改

缺點

違反了開閉原則,當新增物件型別時必須修改工廠函式程式碼

程式碼示例:

'''簡單工廠模式'''
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