一、创建型模式 1.工厂模式

创建型模式处理对象创建相关问题,直接创建对象不太方便时,提供更好的方法

工厂模式

  • 客户端请求一个对象,无需知道这个对象是使用哪个类生成的
  • 工厂背后的思想是简化对象的创建,基于一个中心化函数实现
  • 将创建对象代码和使用对象代码解耦

工厂方法

对不同的输入参数返回不同的对象,传入一个参数(提供表明想要什么),不要求知道对象如何实现以及对象来自哪里。工厂方法设计模式的实现是一个不属于任何类的单一函数,负责单一种类对象(一个形状、一个连接点或者其他对象)的创建。

应用案例

需求

有一些输入数据存储在一个XML文件和一个JSON文件中,要对这两个文件进行解析,获取一些信息。同时,希望能够对这些(以及将来涉及的所有)外部服务进行集中式的客户端连接。

实现

import xml.etree.ElementTree as etree
import 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

class XMLConnector:
    def __init__(self, filepath):
        self.tree = etree.parse(filepath)
    @property
    def parsed_data(self):
        return self.tree
# 函数connection_factory是一个工厂方法,基于输入文件路径的扩展名返回一个
# JSONConnector或XMLConnector的实例,如下所示。
def connector_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)
# 函数connect_to()对connection_factory()进行包装,添加了异常处理
def connect_to(filepath):
    factory = None
    try:
        factory = connection_factory(filepath)
    except ValueError as ve:
        print(ve)
    return factory

你可能感兴趣的:(一、创建型模式 1.工厂模式)