国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

實例講解Python設計模式編程之工廠方法模式的使用

來源:懂視網 責編:小采 時間:2020-11-27 14:35:37
文檔

實例講解Python設計模式編程之工廠方法模式的使用

實例講解Python設計模式編程之工廠方法模式的使用:工廠方法模式是簡單工廠模式的進一步抽象和推廣,它不僅保持了簡單工廠模式能夠向客戶隱藏類的實例化過程這一優點,而且還通過多態性克服了工廠類過于復雜且不易于擴展的缺點。在工廠方法模式中,處于核心地位的工廠類不再負責所有產品的創建,而是將具體的創
推薦度:
導讀實例講解Python設計模式編程之工廠方法模式的使用:工廠方法模式是簡單工廠模式的進一步抽象和推廣,它不僅保持了簡單工廠模式能夠向客戶隱藏類的實例化過程這一優點,而且還通過多態性克服了工廠類過于復雜且不易于擴展的缺點。在工廠方法模式中,處于核心地位的工廠類不再負責所有產品的創建,而是將具體的創
工廠方法模式是簡單工廠模式的進一步抽象和推廣,它不僅保持了簡單工廠模式能夠向客戶隱藏類的實例化過程這一優點,而且還通過多態性克服了工廠類過于復雜且不易于擴展的缺點。在工廠方法模式中,處于核心地位的工廠類不再負責所有產品的創建,而是將具體的創建工作交由子類去完成。工廠方法模式中的核心工廠類經過功能抽象之后,成為了一個抽象的工廠角色,僅負責給出具體工廠子類必須實現的接口,而不涉及哪種產品類應當被實例化這一細節。工廠方法模式的一般性結構如下圖所示,圖中為了簡化只給出了一個產品類和一個工廠類,但在實際系統中通常需要設計多個產品類和多個工廠類。

201632101518272.png (613×243)

工廠方法模式的實質是將對象的創建延遲到其子類實現,即由子類根據當前情況動態決定應該實例化哪一個產品類。從上圖可以看出,工廠方法模式涉及到抽象工廠角色、具體工廠角色、抽象產品角色和具體產品角色四個參與者。

  • 抽象工廠(Creator)角色  是工廠方法模式的核心,它負責定義創建抽象產品對象的工廠方法。抽象工廠不能被外界直接調用,但任何在模式中用于創建產品對象的工廠類都必須實現由它所定義的工廠方法。
  • 具體工廠(Concrete Creator)角色  是工廠方法模式的對外接口,它負責實現創建具體產品對象的內部邏輯。具體工廠與應用密切相關,可以被外界直接調用,創建所需要的產品。
  • 抽象產品(Product)角色  是工廠方法模式所創建的所有對象的父類,它負責描述所有具體產品共有的公共接口。
  • 具體產品(Concrete Product)角色  是工廠方法模式的創建目標,所有創建的對象都是充當這一角色的某個具體類的實例。
  • 抽象工廠角色負責聲明工廠方法(factory method),用來"生產"抽象產品,以下是抽象工廠的示例性Python代碼:

    creator.py
    class Creator:
    """ 抽象工廠角色 """

     # 創建抽象產品的工廠方法
     def factoryMethod(self):
     pass
    

    具體工廠角色負責創建一個具體產品的實例,并將其返回給調用者。具體工廠是與具體產品相關的,實現時一般常用的做法是為每個具體產品定義一個具體工廠。以下是具體工廠的示例性Python代碼:
    concretecreator.py
    class ConcreteCreator(Creator):
    """ 具體工廠角色 """

     # 創建具體產品的工廠方法
     def factoryMethod(self):
     product = ConcreteProduct()
     return product
    

    抽象產品角色的主要目的是為所有的具體產品提供一個共同的接口,通常只需給出相應的聲明就可以了,而不用給出具體的實現。以下是抽象產品類的示例性Python代碼:
    product.py
    class Product:
    """ 抽象產品角色 """

     # 所有產品類的公共接口
     def interface(self):
     pass
    

    具體產品角色充當最終的創建目標,一般來講它是抽象產品類的子類,實現了抽象產品類中定義的所有工廠方法,實際應用時通常會具有比較復雜的業務邏輯。以下是具體產品類的示例性Python代碼:
    concreteproduct.py
    class ConcreteProduct(Product):
    """ 具體產品角色 """

     # 公共接口的實現
     def interface(self):
     print "Concrete Product Method"
    


    在應用工廠方法模式時,通常還需要再引入一個客戶端角色,由它負責創建具體的工廠對象,然后再調用工廠對象中的工廠方法來創建相應的產品對象。以下是客戶端的示例性Python代碼:
    client.py
    class Client:
    """ 客戶端角色 """

    def run(self):
     creator = ConcreteCreator()
     product = creator.factoryMethod()
     product.interface()
    # 主函數
    if (__name__ == "__main__"):
     client = Client()
     client.run()
    


    在這個簡單的示意性實現里,充當具體產品和具體工廠角色的類都只有一個,但在真正的實際應用中,通常遇到的都是同時會有多個具體產品類的情況,此時相應地需要提供多個具體工廠類,每個具體工廠都負責生產對應的具體產品。
    工廠方法模式的活動序列如下圖所示,客戶端Client首先創建ConcreteCreator對象,然后調用ConcreteCreator對象的工廠方法factoryMethod(),由它負責"生產"出所需要的ConcreteProduct對象。

    201632101551418.png (492×296)

    下面我們來看一個具體案例:
    如果你開一家Pizza店(PizzaStore抽象類)賣各種風味的Pizza(Pizza子類),那么你需要根據客戶要求準備相應的Pizza(創建Pizza對象),然后烘烤、切片、包裝;
    最簡單的做法就是在PizzaStore中根據客戶要求(類型判斷)創建相應的Pizza對象,然后調用Pizza自身(由Pizza抽象類實現)的烘烤、切片和包裝方法;
    但這樣的代碼缺乏彈性,因為你讓一個抽象類去依賴具體的對象;我們可以創建一個工廠來生產Pizza,根據傳入的不同類型值返回不同Pizza對象,即從PizzaStore中將創建對象的代碼挪到工廠中。但這只是一個編程技巧,并不算模式。
    在工廠方法模式中,我們在PizzaStore中定義一個抽象接口(create_pizza)作為抽象的工廠,而order_pizza是它的客戶;將Pizza對象的創建放到PizzaStore子類去解決。
    現有Cheese和Clam兩款Pizza,以及NY和Chicago兩家分店,每家店的同款Pizza的口味不同——為迎合當地口味做了改進,主要差別來自不同的原材料,因此我們實現四個Pizza類型(NYStyleCheesePizza、NYStyleClamPizza、ChicagoStyleCheesePizza和ChicagoStyleClamPizza),每種使用不同的原材料組合,根據客戶所在城市和選擇款式我們創建不同的對象;根據工廠方法,我們將對象創建的代碼放到PizzaStore子類去實現。
    代碼:

    #!/usr/bin/python 
    
    class Pizza: 
     name = "" 
     dough = "" 
     sauce = "" 
     toppings = [] 
     
     def prepare(self): 
     print "Preparing %s" % self.name 
     print " dough: %s" % self.dough 
     print " sauce: %s" % self.sauce 
     print " add toppings:" 
     for n in self.toppings: 
     print " %s" % n 
     
     def bake(self): 
     print "Bake for 25 minutes at 350." 
     
     def cut(self): 
     print "Cutting into diagonal slices." 
     
     def box(self): 
     print "Put into official box." 
     
     def get_name(self): 
     return self.name 
     
     
    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 
     
     
    class NYStyleCheesePizza(Pizza): 
     def __init__(self): 
     self.name = "NY Style Cheese Pizza" 
     self.dough = "NY Dough" 
     self.sauce = "NY Sauce" 
     self.toppings.append("NY toopping A") 
     self.toppings.append("NY toopping B") 
     
     
    class ChicagoStyleCheesePizza(Pizza): 
     def __init__(self): 
     self.name = "Chicago Style Cheese Pizza" 
     self.dough = "Chicago Dough" 
     self.sauce = "Chicago Sauce" 
     sefl.toppings.append("Chicago toopping A") 
     
     def cut(self): 
     print "Cutting into square slices." 
     
     
    class NYStyleClamPizza(Pizza): 
     def __init__(self): 
     self.name = "NY Style Clam Pizza" 
     self.dough = "NY Dough" 
     self.sauce = "NY Sauce" 
     self.toppings.append("NY toopping A") 
     self.toppings.append("NY toopping B") 
     
     
    class ChicagoStyleClamPizza(Pizza): 
     def __init__(self): 
     self.name = "Chicago Style Clam Pizza" 
     self.dough = "Chicago Dough" 
     self.sauce = "Chicago Sauce" 
     self.toppings.append("Chicago toopping A") 
     
     def cut(self): 
     print "Cutting into square slices." 
     
     
    class NYPizzaStore(PizzaStore): 
     def create_pizza(self, pizza_type): 
     if pizza_type == "cheese": 
     return NYStyleCheesePizza() 
     elif pizza_type == "clam": 
     return NYStyleClamPizza() 
     else: 
     return None 
     
     
    class ChicagoPizzaStore(PizzaStore): 
     def create_pizza(self, pizza_type): 
     if pizza_type == "cheese": 
     return ChicagoStyleCheesePizza() 
     elif pizza_type == "clam": 
     return ChicagoStyleClamPizza() 
     else: 
     return None 
     
    if __name__ == "__main__": 
     ny_store = NYPizzaStore() 
     chicago_store = ChicagoPizzaStore() 
     
     pizza = ny_store.order_pizza("cheese") 
     print "Mike ordered a %s." % pizza.get_name() 
     print 
     
     pizza = chicago_store.order_pizza("clam") 
     print "John ordered a %s." % pizza.get_name() 
     print 
    
    


    輸出:

    Preparing NY Style Cheese Pizza 
     dough: NY Dough 
     sauce: NY Sauce 
     add toppings: 
     NY toopping A 
     NY toopping B 
    Bake for 25 minutes at 350. 
    Cutting into diagonal slices. 
    Put into official box. 
    Mike ordered a NY Style Cheese Pizza. 
     
    Preparing Chicago Style Clam Pizza 
     dough: Chicago Dough 
     sauce: Chicago Sauce 
     add toppings: 
     NY toopping A 
     NY toopping B 
     Chicago toopping A 
    Bake for 25 minutes at 350. 
    Cutting into square slices. 
    Put into official box. 
    John ordered a Chicago Style Clam Pizza. 
    

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    實例講解Python設計模式編程之工廠方法模式的使用

    實例講解Python設計模式編程之工廠方法模式的使用:工廠方法模式是簡單工廠模式的進一步抽象和推廣,它不僅保持了簡單工廠模式能夠向客戶隱藏類的實例化過程這一優點,而且還通過多態性克服了工廠類過于復雜且不易于擴展的缺點。在工廠方法模式中,處于核心地位的工廠類不再負責所有產品的創建,而是將具體的創
    推薦度:
    標簽: 模式 示例 實例
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 视频一区二区三区欧美日韩 | 一级成人a免费视频 | 国产一区二区在线视频 | 欧美高清一区二区三 | www.亚洲视频 | 亚洲欧美日韩一区 | 中文字幕 日韩有码 | 婷婷久久综合 | 在线观看色视频网站 | 在线观看亚洲一区二区 | 日本一区二区三区精品视频 | 国产精品女同一区二区久久 | 国产资源视频在线观看 | 午夜视频在线 | 性久久久久久 | 欧美激情国产日韩精品一区18 | 欧美高清在线精品一区二区不卡 | 日韩国产一区二区 | 日韩欧美综合 | 欧美一区二区三区视视频 | 欧美精品高清 | 国产精品系列在线观看 | 国产第一夜 | 亚洲区精品久久一区二区三区 | 国产资源免费 | 黄a毛片| 国产91在线 | 中文 | 在线一区二区三区 | 人人草视频在线观看 | 国产日韩欧美自拍 | 国产精品久久久久久久免费 | 亚洲国产精久久久久久久 | 欧美精品一区二区三区免费播放 | 久久成人精品 | 国产欧美中文字幕 | 国产成人精品999在线 | 精品免费国产一区二区女 | 欧美色图亚洲自拍 | 国产成人精品一区二三区2022 | 亚洲色图另类 | 精品国产91久久久久久久 |