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