python設計模式 工廠模式

2021-10-04 16:22:10 字數 3522 閱讀 4124

在工廠設計模式中,客戶端可以請求乙個物件,而無需知道這個物件來自**,即使用哪個類來生成這個物件。工廠背後的思想是簡化物件的建立,物件的建立和使用解耦。

工廠模式的兩種形式:一是工廠方法(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...