【工厂模式】工厂方法

问题

创建对象的代码在许多不同的地方,导致难以跟踪应用中创建的对象

工厂方法

基于单一的函数创建对象:根据传入参数,创建出想要的对象。
(外部不需要知道对象的实现细节)

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'
# 获取存储在json中的数据
factory = extract_data(os.path.join(root_path, 'test.json'))
print(f'JSON Data={factory and factory.parsed_data}\n')

# 获取存储在xml中的数据
factory = extract_data(os.path.join(root_path, 'test.xml'))
print(f'XML Data={factory and factory.parsed_data}\n')

# 获取存储在ini中的数据,会报异常
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