国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

舉例講解Python設計模式編程中對抽象工廠模式的運用

2020-01-04 17:40:53
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python設計模式編程中對抽象工廠模式的運用,文中的例子體現了抽象工廠模式程序的一些設計優化點,需要的朋友可以參考下
 

抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
優點:易于交換“產品系列”,只要更改相應的工廠即可。
缺點:建立產品的時候很繁瑣,需要增加和修改很多東西。

優化1:為了避免客戶端有過多的邏輯判斷,可以封裝出一個簡單工廠類來生成產品類。
優化2:為了減少簡單工廠類里面的邏輯判斷,可以采用“反射”機制,直接根據外部的配置文件讀取出需要使用產品類的信息。

#encoding=utf-8 # #by panda #抽象工廠模式  def printInfo(info):   print unicode(info, 'utf-8').encode('gbk')    #抽象產品A:user表 class IUser():   def Insert(self):     pass   def GetUser(self):     pass  #sqlserver實現的User class SqlserverUser(IUser):   def Insert(self):     printInfo("在SQL Server中給User表增加一條記錄")   def GetUser(self):     printInfo("在SQL Server中得到User表的一條記錄")  #Access實現的User class AccessUser(IUser):   def Insert(self):     printInfo("在Access中給User表增加一條記錄")   def GetUser(self):     printInfo("在Access中得到User表一條記錄")   #抽象產品B:部門表 class IDepartment():   def Insert(self):     pass   def GetUser(self):     pass  #sqlserver實現的Department class SqlserverDepartment(IUser):   def Insert(self):     printInfo("在SQL Server中給Department表增加一條記錄")   def GetUser(self):     printInfo("在SQL Server中得到Department表的一條記錄")  #Access實現的Department class AccessDepartment(IUser):   def Insert(self):     printInfo("在Access中給Department表增加一條記錄")   def GetUser(self):     printInfo("在Access中得到Department表一條記錄")   #抽象工廠 class IFactory():   def CreateUser(self):     pass   def CreateDepartment(self):     pass    #sql server工廠 class SqlServerFactory(IFactory):   def CreateUser(self):     return SqlserverUser()   def CreateDepartment(self):     return SqlserverDepartment()  #access工廠 class AccessFactory(IFactory):   def CreateUser(self):     return AccessUser()   def CreateDepartment(self):     return AccessDepartment()    #優化一:采用一個簡單工廠類,封裝邏輯判斷操作 class DataAccess(): #  db = "Sqlserver"   db = "Access"   @staticmethod   def CreateUser():     if (DataAccess.db == "Sqlserver"):       return SqlserverUser()     elif(DataAccess.db == "Access"):       return AccessUser()   @staticmethod   def CreateDepartment():     if (DataAccess.db == "Sqlserver"):       return SqlserverDepartment()     elif(DataAccess.db == "Access"):       return AccessDepartment()      #優化二:采用反射機制,避免使用太多判斷 ##以下信息可以從配置文件中獲取 DBType = 'Sqlserver' #'Access' DBTab_User = 'User' DBTab_Department = 'Department'  class DataAccessPro(): #  db = "Sqlserver"   db = "Access"   @staticmethod   def CreateUser():     funName = DBType + DBTab_User     return eval(funName)() #eval 將其中的字符串轉化為python表達式   @staticmethod   def CreateDepartment():     funName = DBType + DBTab_Department     return eval(funName)()      def clientUI():   printInfo("/n--------抽象工廠方法--------")   factory = SqlServerFactory()   iu = factory.CreateUser()   iu.Insert()   iu.GetUser()   id = factory.CreateDepartment()   id.Insert()   id.GetUser()      printInfo("/n--抽象工廠方法+簡單工廠方法--")   iu = DataAccess.CreateUser()   iu.Insert()   iu.GetUser()   id = DataAccess.CreateDepartment()   id.Insert()   id.GetUser()      printInfo("/n-抽象工廠方法+簡單工廠方法+反射-")   iu = DataAccessPro.CreateUser()   iu.Insert()   iu.GetUser()   id = DataAccessPro.CreateDepartment()   id.Insert()   id.GetUser()     return   if __name__ == '__main__':   clientUI(); 

類圖:

舉例講解Python設計模式編程中對抽象工廠模式的運用

工廠模式和抽象工廠模式的區別:工廠模式是在派生類中定義一個工廠的抽象接口,然后基類負責創建具體對象;抽象工廠模式是維護一個產品家族,由基類定義產品被生產的方法,客戶根據派生類的接口進行開發。

實例:人民群眾喜聞樂見的披薩店例子這里又可以搬出來了,這次我們根據抽象工廠模式的特點,用不同原材料制作不同口味的披薩,創建不同原材料的工廠,不同實體店做出口味不同的披薩。創建一個產品家族(Dough、Sauce、Cheese和Clam)的抽象類型(PizzaIngredientFactory),這個類型的子類(NYPizzaIngredientFactory和ChicagoPizzaIngredientFactory)定義了產品被產生的方法。
代碼:

#!/usr/bin/python# -*- coding:utf-8 -*-import sysreload(sys)sys.setdefaultencoding('utf-8') '''披薩'''class Pizza:  name = ""  dough = None  sauce = None  cheese = None  clam = None   def prepare(self):    pass   def bake(self):    print "烘烤25分鐘在350。".decode('utf-8')   def cut(self):    print "切割成對角線切片。".decode('utf-8')   def box(self):    print "放在官方的盒子中。".decode('utf-8')   def get_name(self):    return self.name   def set_name(self, name):    self.name = name   def to_string(self):    string = "%s:/n" % self.name    string += "  面團: %s/n" % self.dough.to_string() if self.dough else ""    string += "  醬汁: %s/n" % self.sauce.to_string() if self.sauce else ""    string += "  奶酪: %s/n" % self.cheese.to_string() if self.cheese else ""    string += "  文蛤: %s/n" % self.clam.to_string() if self.clam else ""    return string '''什么類別的披薩'''class CheesePizza(Pizza):  def __init__(self, ingredient_factory):    self.ingredient_factory = ingredient_factory   def prepare(self):    print "準備: %s" % self.name    self.dough = self.ingredient_factory.create_dough()    self.sauce = self.ingredient_factory.create_sauce()    self.cheese = self.ingredient_factory.create_cheese()  class ClamPizza(Pizza):  def __init__(self, ingredient_factory):    self.ingredient_factory = ingredient_factory   def prepare(self):    print "準備: %s" % self.name    self.dough = self.ingredient_factory.create_dough()    self.sauce = self.ingredient_factory.create_sauce()    self.clam = self.ingredient_factory.create_clam() '''披薩店'''class PizzaStore:  def order_pizza(self, pizza_type):    self.pizza = self.create_pizza(pizza_type)    self.pizza.prepare()    self.pizza.bake()    self.pizza.cut()    self.pizza.box()    return self.pizza   def create_pizza(self, pizza_type):    pass '''紐約披薩實體店1'''class NYPizzaStore(PizzaStore):  def create_pizza(self, pizza_type):    ingredient_factory = NYPizzaIngredientFactory()     if pizza_type == "cheese":      pizza = CheesePizza(ingredient_factory)      pizza.set_name("紐約風格芝士披薩".decode('utf-8'))    elif pizza_type == "clam":      pizza = ClamPizza(ingredient_factory)      pizza.set_name("紐約風格文蛤披薩".decode('utf-8'))    else:      pizza = None     return pizza '''芝加哥披薩實體店2'''class ChicagoPizzaStore(PizzaStore):   def create_pizza(self, pizza_type):    ingredient_factory = ChicagoPizzaIngredientFactory()     if pizza_type == "cheese":      pizza = CheesePizza(ingredient_factory)      pizza.set_name("芝加哥風格芝士披薩".decode('utf-8'))    elif pizza_type == "clam":      pizza = ClamPizza(ingredient_factory)      pizza.set_name("芝加哥風格文蛤披薩".decode('utf-8'))    else:      pizza = None     return pizza '''生產披薩的工廠'''class PizzaIngredientFactory:  def create_dough(self):    pass   def create_sauce(self):    pass   def create_cheese(self):    pass   def create_clam(self):    pass '''生產披薩的實體工廠1'''class NYPizzaIngredientFactory(PizzaIngredientFactory):  def create_dough(self):    return ThinDough()   def create_sauce(self):    return MarinaraSauce()   def create_cheese(self):    return FreshCheese()   def create_clam(self):    return FreshClam() '''生產披薩的實體工廠2'''class ChicagoPizzaIngredientFactory(PizzaIngredientFactory):  def create_dough(self):    return ThickDough()   def create_sauce(self):    return MushroomSauce()   def create_cheese(self):    return BlueCheese()   def create_clam(self):    return FrozenClam()  class Dough:  def to_string(self):    pass class ThinDough(Dough):  def to_string(self):    return "薄的面團" class ThickDough(Dough):  def to_string(self):    return "厚的生面團" class Sauce:  def to_string(self):    pass class MarinaraSauce(Sauce):  def to_string(self):    return "番茄醬" class MushroomSauce(Sauce):  def to_string(self):    return "蘑菇醬" class Cheese:  def to_string(self):    pass class FreshCheese(Cheese):  def to_string(self):    return "新鮮的奶酪" class BlueCheese(Cheese):  def to_string(self):    return "藍紋奶酪" class Clam:  def to_string(self):    pass class FreshClam(Clam):  def to_string(self):    return "新鮮的文蛤" class FrozenClam(Clam):  def to_string(self):    return "冷凍的文蛤" if __name__ == "__main__":  # 創建了兩個披薩實體店  ny_store = NYPizzaStore()  chicago_store = ChicagoPizzaStore()   # 在第一個披薩對象中訂購了一個cheese風味的披薩  pizza = ny_store.order_pizza("cheese")  print pizza.to_string()  print "邁克訂購了一個 %s" % pizza.get_name()  print   pizza = chicago_store.order_pizza("clam")  print pizza.to_string()  print "約翰訂購了一個%s" % pizza.get_name()

結果:

準備: 紐約風格芝士披薩烘烤25分鐘在350。切割成對角線切片。放在官方的盒子中。紐約風格芝士披薩:  面團: 薄的面團  醬汁: 番茄醬  奶酪: 新鮮的奶酪 邁克訂購了一個 紐約風格芝士披薩 準備: 芝加哥風格文蛤披薩烘烤25分鐘在350。切割成對角線切片。放在官方的盒子中。芝加哥風格文蛤披薩:  面團: 厚的生面團  醬汁: 蘑菇醬  文蛤: 冷凍的文蛤 約翰訂購了一個芝加哥風格文蛤披薩

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永定县| 沙雅县| 宜丰县| 武宣县| 威宁| 江油市| 广汉市| 宜兰县| 加查县| 崇明县| 封丘县| 眉山市| 潞西市| 达拉特旗| 灵山县| 揭阳市| 镇江市| 双江| 新兴县| 伊通| 卢氏县| 独山县| 萍乡市| 满洲里市| 潮州市| 马尔康县| 武宁县| 交城县| 高安市| 南城县| 平泉县| 苍南县| 内乡县| 兴城市| 砀山县| 辽中县| 平邑县| 德保县| 南澳县| 梁河县| 湄潭县|