《精通Python设计模式》之工厂模式

引自《精通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))
发布了92 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zZzZzZ__/article/details/103555695
今日推荐