在工廠設計模式中,客戶端可以請求乙個物件,而無需知道這個物件來自**,即使用哪個類來生成這個物件。工廠背後的思想是簡化物件的建立,物件的建立和使用解耦。
工廠模式的兩種形式:一是工廠方法(factory method),對不同的輸入引數返回不同的物件;二是抽象工廠,它是一組用於建立一系列相關事物物件的工廠方法。
1. 工廠方法
在工廠方法模式中,執行單個函式,傳入乙個引數,但並不要求知道任何關於物件如何實現以及物件來自**的細節。軟體的例子比如django框架使用工廠方法模式來建立表單字段。django的forms模組支援不同種類字段(charfield、emailfield)的建立和定製(max_length、required)。
實現例子:對於可讀檔案格式:xml和json,對這兩種檔案進行解析,我們使用python自帶的庫(xml.etree.elementtree和json)來處理xml和json
import xml.etree.elementtree as etree
import json
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 # 使方法更像乙個常規變數,變成類的乙個屬性,可以使用點符號訪問
def parsed_data(self):
return self.data
class xmlconnector:
def __init__(self, filepath):
self.tree = etree.parse(filepath)
@property
def parsed_data(self):
return self.tree
函式connector_factory是乙個工廠方法,基於輸入檔案路徑的副檔名返回乙個jsonconnector或xmlconnector的例項。
def connector_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()對connector_factory()進行包裝,新增異常處理
def connect_to(filepath):
factory = none
try:
factory = connector_factory(filepath)
except valueerror as ve:
print (ve)
return factory
2. 抽象工廠
抽象工廠設計模式是抽象方法的一種泛化。概括來說,乙個抽象工廠是一組工廠方法,其中每個工廠方法負責產生不同種類的物件。使用抽象工廠,讓物件的建立更容易追蹤,將物件的建立與使用解耦,提供優化記憶體占用和應用效能的潛力
abstract_facotry.py
from abc import abc, abstractmethod
# 下面的類為工廠類介面及其子
class creator(abc):
@abstractmethod
def factory_a(self):
pass
@abstractmethod
def factory_b(self):
pass
@staticmethod
def get_creator(option):
if option == '1':
return concretecreatora()
elif option == '2':
return concretecreatorb()
class concretecreatora(creator):
def factory_a(self):
return producta1()
def factory_b(self):
return productb1()
class concretecreatorb(creator):
def factory_a(self):
return producta2()
def factory_b(self):
return productb2()
# 以下類為產品類介面及其實現子類的**
class producta(abc):
@abstractmethod
def get_product(self):
pass
class producta1(producta):
def get_product(self):
return'producta1'
class producta2(producta):
def get_product(self):
return'producta2'
class productb(abc):
@abstractmethod
def get_product(self):
pass
class productb1(productb):
def get_product(self):
return'productb1'
class productb2(productb):
def get_product(self):
return'productb2'
def main():
# 獲取產品型別與種類
product_class = input("產品種類:").upper() # a b
product_type = input("產品型別:") # 1 2
# 獲取具體工廠子類物件
creator = creator.get_creator(product_type)
# 獲得具體的產品物件
if product_class == 'a':
product = creator.factory_a()
print(product.get_product())
elif product_class == 'b':
product = creator.factory_b()
print(product.get_product())
if __name__ == '__main__':
main()
python設計模式 工廠模式
在學習工廠模式之前,我們必須要了解何為所謂的工廠模式 這篇部落格,我就利用乙個例子來一步步對工廠模式,進行概述 提到工廠模式,我們要有兩個事物,一是工廠,二是產品,具體工廠 產品是什麼型別的?這裡是抽象的,不具體的,需要具體的工廠 產品來繼承或實現其方法,才能稱為具體工廠 具體產品 接下來我定義1個...
Python設計模式 工廠模式
一 工程模式執行場景 若需要將物件的建立和使用解耦,工廠方法也能派上用場。工廠方法可以在必要時建立新的物件,從而提高效能和記憶體使用率。二 工廠模式案例import xml.etree.elementtree as etree import json class jsonconnector def ...
Python 設計模式 簡單工廠模式
簡單工廠模式,作為oo 乙個較為簡單的建立者設計模式。其主要思想,通過介面或繼承建立 不同的子類。現在乙個dom解析器作為父類,其中xml,soup 分別作為兩個不同解析方式,作為子類。vechicl 的建立 如下 1 外部依賴的介面,它遮蔽了我具體使用的第三方庫 2class omtree 3de...