python設計模式 工廠模式

2021-08-17 02:52:25 字數 3365 閱讀 7678

在學習工廠模式之前,我們必須要了解何為所謂的工廠模式

這篇部落格,我就利用乙個例子來一步步對工廠模式,進行概述

提到工廠模式,我們要有兩個事物,一是工廠,二是產品,具體工廠、產品是什麼型別的?

這裡是抽象的,不具體的,需要具體的工廠、產品來繼承或實現其方法,才能稱為具體工廠、具體產品

接下來我定義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_namebike自行車廠的名字

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...