工厂模式主要是为了解决对象创建问题:客户端可以请求一个对象,而不需要知道这个对象来自哪里,换句话说,客户端在请求一个对象时,不需要知道该对象是被哪一个类创建的。这样做的好处是可以方便的解耦对象的使用和创建,工厂模式有两种实现方式:工厂方法和抽象工厂。
1.工厂方法
执行单个函数,通过传递的参数来确定需要的对象信息。
import json
import xml.etree.ElementTree as etree
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
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 e:
        print(e)
    return factory
2.抽象工厂
抽象工厂设计模式是抽象方法的一种泛化。概括来说,一个抽象工厂是(逻辑上的)一组工厂方法,其中的每个工厂方法负责产生不同种类的对象。
工厂方法适合对象种类比较少的情况,当有多种不同类型的对象需要创建时,就需要使用抽象模式。
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_characters(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 'kill it'
class WizardWorld:
    def __init__(self, name):
        print(self)
        self.player_name = name
    def __str__(self):
        return '\n\n\t----Wizard World -----'
    def make_characters(self):
        return Wizard(self.player_name)
    def make_obstacle(self):
        return Ork()
class GameEnvironment:
    """ 抽象工厂,根据不同的玩家类型创建不同的角色和障碍 (游戏环境)
        这里可以根据年龄判断,成年人返回『巫师』游戏,小孩返回『青蛙过河』游戏"""
    def __init__(self, factory):
        self.hero = factory.make_characters
        self.obstacle = factory.make_obstacle()
    def play(self):
        self.hero.interact_with(self.obstacle)