问题
创建对象的代码在许多不同的地方,导致难以跟踪应用中创建的对象
工厂方法
基于单一的函数创建对象:根据传入参数,创建出想要的对象。
(外部不需要知道对象的实现细节)
Demo
背景&&需求
XXX数据存储于XML文件和JSON文件中,目前需要获取XXX数据
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| import os import json import xml.etree.ElementTree as etree
class JSONDataExtractor: def __init__(self, file_path): self.data = dict() with open(file_path, mode='r', encoding='utf-8') as f: self.data = json.load(f) @property def parsed_data(self): return self.data
class XMLDataExtractor: def __init__(self, file_path): self.tree = etree.parse(file_path)
@property def parsed_data(self): return self.tree
def data_extractor_factory(file_path): if file_path.endswith('json'): extractor = JSONDataExtractor elif file_path.endswith('xml'): extractor = XMLDataExtractor else: raise ValueError(f'Cannot extract data from {file_path}') return extractor(file_path)
def extract_data(file_path): factory_obj = None try: factory_obj = data_extractor_factory(file_path) except ValueError as e: print(e) return factory_obj
if __name__=="__main__": root_path = '/20210523' factory = extract_data(os.path.join(root_path, 'test.json')) print(f'JSON Data={factory and factory.parsed_data}\n')
factory = extract_data(os.path.join(root_path, 'test.xml')) print(f'XML Data={factory and factory.parsed_data}\n')
factory = extract_data(os.path.join(root_path, 'test.ini')) print(f'Abnormal Data={factory and factory.parsed_data}')
|
输出
JSON Data=[{‘title’: ‘Ha’}]
XML Data=<xml.etree.ElementTree.ElementTree object at 0x7fcd15d79a60>
Cannot extract data from 20210523/test.ini
Abnormal Data=None