在學習工廠模式之前,我們必須要了解何為所謂的工廠模式
這篇部落格,我就利用乙個例子來一步步對工廠模式,進行概述
提到工廠模式,我們要有兩個事物,一是工廠
,二是產品
,具體工廠、產品是什麼型別的?
這裡是抽象的,不具體的,需要具體的工廠、產品來繼承或實現其方法,才能稱為具體工廠、具體產品
接下來我定義1個抽象的工廠,它的實現類或子類是自行車廠、汽車廠
接下來我定義1個抽象的產品,它的實現類或子類是自行車、汽車
然後自行車的實現類或子類是摩拜單車、ofo單車
然後汽車的實現類或子類是滴滴、快滴
工廠模式的定義如下:定義乙個用於建立物件的介面,讓子類決定例項化哪個類。工廠方法使乙個類的例項化延遲到其子類
具體組織關係圖如下:(如下抽象車代指抽象產品)
為了更容易理解,為了精簡**,我下面的例子就構造乙個自行車廠(汽車廠省略),車構造乙個自行車(汽車省略),自行車在構造出摩拜單車、ofo單車(滴滴、快滴省略)
那麼好,我們就來一步步構造所謂的工廠模式
抽象工廠、抽象產品從哪個開始呢?都可以,那我就先從抽象類工廠開始
抽象工廠有哪些抽象方法呢?我們就給它設定乙個抽象方法createwheel
,意思就是生產車,具體是生產自行車,還是汽車,這讓子類去實現,抽象工廠類abstractfactory
,只是提供抽象的介面方法createwheel
供給子類去實現
我們在抽象工廠類的基礎上構造乙個自行車廠類,自行車廠類實現了抽象工廠類的抽象方法#抽象工廠類
class
abstractfactory
(metaclass=abcmeta):
@abstractmethod
defcreatewheel
(self,abs_wheel):
pass
createwheel
,通過abs_wheel()
去生產一輛車(例項化一輛車),然後將這個生產好的車例項,self.bike
賦給自己做變數,然後在呼叫車物件例項的say_hi
方法,如下是**:
到此抽象class
bike
(abstractfactory):
def__init__
(self,factory_name):
self.factory_name = factory_name
defcreatewheel
(self,abs_wheel):
self.bike = abs_wheel()
self.bike.say_hi(self.factory_name)
abstractfactory
工廠類,及其它的實現類自行車廠bike
構造完畢
接下來就看抽象車類abstractwheel
,跟抽象工廠類一樣,我們也需要構造乙個抽象的車類,裡面也是乙個空的抽象方法,引數factory_name
是bike
自行車廠的名字
此刻抽象車類class
abstractwheel
(metaclass=abcmeta):
@abstractmethod
defsay_hi
(self,factory_name):
pass
abstractwheel
構造完畢,然後我們就去構造該抽象類的2個子類,乙個摩拜單車mobai
類,乙個ofo
單車類,這2個類均實現抽象車類abstractwheel
的抽象方法say_hi
,該實現後的方法就輸出一句話print("hi~我是%s生產出來的%s" % (factory_name, self.name))
,另外__init__
方法中,是每個單車類的名字
**如下:
最後抽象工廠類,具體工廠類,抽象車類,具體車類均構造完畢class
mobai
(abstractwheel):
def__init__
(self):
self.name = "摩拜單車"
defsay_hi
(self,factory_name):
print("hi~我是%s生產出來的%s" % (factory_name, self.name))
class
ofo(abstractwheel):
def__init__
(self):
self.name = "ofo單車"
defsay_hi
(self,factory_name):
print("hi~我是%s生產出來的%s" % (factory_name, self.name))
那麼就進行測試,測試**如下:
測試輸出結果如下:bike=bike("自行車廠")
mobai=bike.createwheel(mobai)
ofo=bike.createwheel(ofo)
hi~我是自行車廠生產出來的摩拜單車
hi~我是自行車廠生產出來的ofo單車
三、工廠模式的優點和應用
工廠模式、抽象工廠模式的優點:
1、工廠模式巨有非常好的封裝性,**結構清晰;在抽象工廠模式中,其結構還可以隨著需要進行更深或者更淺的抽象層級調整,非常靈活;
2、遮蔽產品類,使產品的被使用業務場景和產品的功能細節可以分而開發進行,是比較典型的解耦框架。
工廠模式、抽象工廠模式的使用場景:
1、當系統例項要求比較靈活和可擴充套件時,可以考慮工廠模式或者抽象工廠模式實現。比如,
在通訊系統中,高層通訊協議會很多樣化,同時,上層協議依賴於下層協議,那麼就可以對應建立對應層級的抽象工廠,根據不同的「產品需求」去生產定製的例項。
四、工廠類模式的不足
1、工廠模式相對於直接生成例項過程要複雜一些,所以,在小專案中,可以不使用工廠模式;
2、抽象工廠模式中,產品類的擴充套件比較麻煩。畢竟,每乙個工廠對應每一類產品,產品擴充套件,就意味著相應的抽象工廠也要擴充套件。
Python設計模式 工廠模式
一 工程模式執行場景 若需要將物件的建立和使用解耦,工廠方法也能派上用場。工廠方法可以在必要時建立新的物件,從而提高效能和記憶體使用率。二 工廠模式案例import xml.etree.elementtree as etree import json class jsonconnector def ...
python設計模式 工廠模式
在工廠設計模式中,客戶端可以請求乙個物件,而無需知道這個物件來自 即使用哪個類來生成這個物件。工廠背後的思想是簡化物件的建立,物件的建立和使用解耦。工廠模式的兩種形式 一是工廠方法 factory method 對不同的輸入引數返回不同的物件 二是抽象工廠,它是一組用於建立一系列相關事物物件的工廠方...
Python 設計模式 簡單工廠模式
簡單工廠模式,作為oo 乙個較為簡單的建立者設計模式。其主要思想,通過介面或繼承建立 不同的子類。現在乙個dom解析器作為父類,其中xml,soup 分別作為兩個不同解析方式,作為子類。vechicl 的建立 如下 1 外部依賴的介面,它遮蔽了我具體使用的第三方庫 2class omtree 3de...