Python設計模式 簡單工廠模式

2021-09-11 10:26:44 字數 3988 閱讀 1871

what

建立型設計模式處理物件建立相關的問題,目標是當直接建立物件(在python中是通過__init__()函式實現的)不太方便時,提供更好的方式。

在工廠設計模式中,客戶端可以請求乙個物件,而無需知道這個物件來自**;也就是,使用哪個類來生成這個物件。工廠背後的思想是簡化物件的建立。與客戶端自己基於類例項化直接建立物件相比,基於乙個中心化函式來實現,更易於追蹤建立了哪些物件。通過將建立物件的**和使用物件的**解耦,工廠能夠降低應用維護的複雜度。簡單來說,就是抽象物件(父類)——具體物件(子類)。

工廠通常有兩種形式:一種是工廠方法(factory method),它是乙個方法(或以地道的python術語來說,是乙個函式),對不同的輸入引數返回不同的物件;第二種是抽象工廠,它是一組用於建立一系列相關事物物件的工廠方法。

有個簡單的例子,製造塑料玩具的壓塑粉都是一樣的,但使用不同的塑料模具就能產出不同的外形。比如,有乙個工廠方法,輸入是目標外形(鴨子或小車)的名稱,輸出則是要求的塑料外形,正如同乙份三文魚,大佬和菜鳥做出來肯定不一樣的。

django框架是使用工廠方法來建立表單字段的,django的forms模組支援不同種類字段(charfield、emailfield) 的 創 建 和 定 制(max_length、required)。

why如果你建立物件的**分布在不同地方,而不是僅在乙個函式/方法中,無法跟蹤這些物件時,你可以考慮使用工廠方法。

工廠方法集中在乙個地方建立物件,使得物件跟蹤起來容易。

建立多個工廠方法也完全沒有問題,實踐中通常也這麼做,對相似的物件建立進行邏輯分組,每個工廠方法負責乙個分組。 例如,有乙個工廠方法負責連線到不同的資料庫(mysql、sqlite),另乙個工廠方法負責建立要求的

幾何物件(圓形、三角形),等等 。

how舉個例子,我們有一些輸入資料儲存在乙個xml檔案和乙個json檔案中,要對這兩個檔案進行解析,獲取一些資訊。同時,希望能夠對這些(以及將來涉及的所有)外部服務進行集中式的客戶端連線。我們使用工廠方法來解決這個問題。雖然僅以xml和json為例,但為更多的服務新增支援也很簡單 。

import xml.etree.elementtree as etree

import json

#類jsonconnector解析json檔案,通過parsed_data()方法以乙個字典(dict)的形式返回資料。修飾器property使parsed_data()顯得更像乙個常規的變數,而不是乙個方法。

class

jsonconnector

:def

__init__

(self, filepath)

: self.data =

dict()

with

open

(filepath, mode=

'r', encoding=

'utf-8'

)as f:

self.data = json.load(f)

@property

defparsed_data

(self)

:return self.data

# 類xmlconnector解析 xml 檔案,通過parsed_data()方法以xml.etree.element列表的形式返回所有資料,如下所示。

class

xmlconnector

:def

__init__

(self, filepath)

: self.tree = etree.parse(filepath)

@property

defparsed_data

(self)

:return self.tree

#函式connection_factory是乙個工廠方法,基於輸入檔案路徑的副檔名返回乙個jsonconnector或xmlconnector的例項,如下所示。

defconnector_factory

(filepath)

:if filepath.endswith(

'json'):

connector = jsonconnector

elif filepath.endswith(

'xml'):

connector = xmlconnector

else

:raise valueerror(

'cannot connect to {}'

.format

(filepath)

)return connector(filepath)

# 函式connect_to()對connection_factory()進行包裝,新增了異常處理,如下所示。

defconnect_to

(filepath)

: factory =

none

try:

factory = connection_factory(filepath)

except valueerror as ve:

print

(ve)

return factory

# 函式main()演示如何使用工廠方法設計模式。

defmain()

: sqlite_factory = connect_to(

'data/person.sq3'

)print()

xml_factory = connect_to(

'data/person.xml'

) xml_data = xml_factory.parsed_data

liars = xml_data.findall(

".//{}[{}='{}']"

.format

('person'

,'lastname'

,'liar'))

print

('found: {} persons'

.format

(len

(liars)))

for liar in liars:

print

('first name: {}'

.format

(liar.find(

'firstname'

).text)

)print

('last name: {}'

.format

(liar.find(

'lastname'

).text))[

print

('phone number ({})'

.format

(p.attrib[

'type'])

, p.text)

for p in liar.find(

'phonenumbers')]

print()

json_factory = connect_to(

'data/donut.json'

) json_data = json_factory.parsed_data

print

('found: {} donuts'

.format

(len

(json_data)))

for donut in json_data:

print

('name: {}'

.format

(donut[

'name'])

)print

('price: ${}'

.format

(donut[

'ppu'])

)[print

('topping: {} {}'

.format

(t['id'

], t[

'type'])

)for t in donut[

'topping'

]

設計模式 工廠模式(簡單工廠模式和方法工廠模式)

一 簡單工廠模式 簡單工廠模式概述 又叫靜態工廠方法模式,它定義乙個具體的工廠類負責建立一些類的例項 優點 客戶端不需要在負責物件的建立,從而明確了各個類的職責 缺點 這個靜態工廠類負責所有物件的建立,如果有新的物件增加,或者某些物件的建立方式不同,就需要不斷的修改工廠類,不利於後期的維護 動物類 ...

設計模式之簡單工廠 工廠方法模式 抽象工廠模式

這裡講三種模式放在一起說明,是因為三種模式關聯性很強 抽象工廠模式簡單化以後就是工廠方法模式,工廠方法模式再簡單化就是簡單工廠模式 簡單工廠模式並沒有被列入到gof的設計模式中 public class factory 簡單工廠類,實現建立產品物件 class factory return prod...

Python下的設計模式學習(1) 簡單工廠模式

使用物件導向的思想設計乙個簡單的計算器類 基於物件導向的四個原則即使得 具有可維護,可復用,可擴充套件,靈活性好的特點 我們需要通過封裝,繼承,多型把程式的耦合度降低。將程式的業務邏輯於介面邏輯分開,讓它們之間的耦合度下降,才可以達到容易維護和擴充套件。比如該問題,使用者只需要知道使用特定的符號,以...