引自《精通Python设计模式》 一书
-
简单工厂模式
import xml.etree.ElementTree as etree
import json
'''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
'''xml类'''
class XMLConnector:
def __init__(self, filepath):
self.tree = etree.parse(filepath)
@property
def parsed_data(self):
return self.tree
'''工厂方法'''
def connection_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)
'''包装工厂方法'''
def connect_to(filepath):
factory = None
try:
factory = connection_factory(filepath)
except ValueError as ve:
print(ve)
return factory
'''调用包装过的工厂方法'''
def main():
sqlite_factory = connect_to('data/person.sq3')
print()
'''迭代xml'''
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'''
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']]
if __name__ == '__main__':
main()
-
抽象工厂模式
class Frog:
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def interact_with(self, obstacle):
print('{} the Frog encounters {} and {}!'.format(self,
obstacle, obstacle.action()))
class Bug:
def __str__(self):
return 'a bug'
def action(self):
return 'eats it'
class FrogWorld:
def __init__(self, name):
print(self)
self.player_name = name
def __str__(self):
return '\n\n\t------ Frog World -------'
def make_character(self):
return Frog(self.player_name)
def make_obstacle(self):
return Bug()
class Wizard:
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def interact_with(self, obstacle):
print('{} the Wizard battles against {} and {}!'.format(self, obstacle,
obstacle.action()))
class Ork:
def __str__(self):
return 'an evil ork'
def action(self):
return 'kills it'
class WizardWorld:
def __init__(self, name):
print(self)
self.player_name = name
def __str__(self):
return '\n\n\t------ Wizard World -------'
def make_character(self):
return Wizard(self.player_name)
def make_obstacle(self):
return Ork()
class GameEnvironment:
def __init__(self, factory):
self.hero = factory.make_character()
self.obstacle = factory.make_obstacle()
def play(self):
self.hero.interact_with(self.obstacle)
def validate_age(name):
try:
age = input('Welcome {}. How old are you? '.format(name))
age = int(age)
except ValueError as err:
print("Age {} is invalid, please try again...".format(age))
return (False, age)
return (True, age)
def main():
name = input("Hello. What's your name? ")
valid_input = False
while not valid_input:
valid_input, age = GameEnvironment.validate_age(name)
game = FrogWorld if age < 18 else WizardWorld
environment = GameEnvironment(game(name))
environment.play()
if __name__ == '__main__':
main()
- 模仿工厂模式编写一个工厂方法,输入类型为文件夹或单个文件路径或多个文件路径,返回结果为一个图片后缀的文件路径列表
import os
path1 = '/home/ly/Desktop/pictureFiles'
path2 = '/home/ly/Desktop/pictureFiles/chanel6_14000.jpg'
path3 = ['/home/ly/Desktop/pictureFiles/chanel6_4000.jpg','/home/ly/Desktop/pictureFiles/chanel6_5000.bm']
'''封装工厂方法'''
def fileInput(input):
if not input:
return
if isinstance(input,list):
rest = filesFactory(input)
return rest.parsed_data
elif os.path.isdir(input):
rest = folderFactory(input)
return rest.parsed_data
else:
rest = fileFactory(input)
return rest.parsed_data
'''工厂抽象类'''
class factory():
picFormat = ['.jpg', '.png', '.bpm']
files = []
'''事件处理类'''
def handleInput(self,input):
pass
'''文件夹处理类'''
class folderFactory(factory):
def __init__(self,input):
super().__init__()
self.handleInput(input)
def handleInput(self,input):
self.files.clear()
folderPath = input
fileList = os.listdir(folderPath)
for file in fileList:
if not os.path.isdir(os.path.join(folderPath, file)):
for str in self.picFormat:
if file.endswith(str):
self.files.append(os.path.join(folderPath, file))
break
'''获取文件绝对路径列表'''
@property
def parsed_data(self):
return self.files #返回图片完整路径列表
'''单文件处理类'''
class fileFactory(factory):
def __init__(self,input):
super().__init__()
self.handleInput(input)
def handleInput(self,input):
self.files.clear()
file = input
for str in self.picFormat:
if file.endswith(str):
self.files.append(file)
break
'''获取文件绝对路径列表'''
@property
def parsed_data(self):
return self.files #返回图片完整路径列表
'''多文件处理类'''
class filesFactory(factory):
def __init__(self,input):
super().__init__()
self.handleInput(input)
def handleInput(self,input):
self.files.clear()
fileList = input
for file in fileList:
for str in self.picFormat:
if file.endswith(str):
self.files.append(file)
break
'''获取文件绝对路径列表'''
@property
def parsed_data(self):
return self.files #返回图片完整路径列表
p = fileInput(path3)
print(p)
print(len(p))