前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第一天:创建型模式--工厂方法模式

第一天:创建型模式--工厂方法模式

作者头像
喵叔
发布2020-09-08 15:59:56
3200
发布2020-09-08 15:59:56
举报
文章被收录于专栏:喵叔's 专栏喵叔's 专栏
零、创建型模式

开篇先简单说一下创建型模式,它关注对象的创建过程,将类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。使得相同的创建过程可以多次复用,且修改二者中的任一个对另一个几乎不造成任何影响。 创建型模式有五种:简单工厂模式工厂方法模式抽象工厂模式建造者模式原型模式单例模式。这里面我们只讲常用的工厂方法模式、抽象工厂模式和原型模式。

一、工厂方法
  • 什么是工厂方法: 它是一个方法,对不同的输入参数返回不同的对象。在工厂方法模式中,我们执行单个函数,传入一个参数,并不要求知道任何关于对象如何实现以及来自哪里的细节
二、身边的例子
  • 早点摊买粥 我只需要告诉早点摊的老板要购买的粥的名字(比如皮蛋瘦肉粥),老板就会给我所购买的粥,具体这碗粥是怎么做出来的,以及是来自其他早点摊或者老板自己做的,这些我都不需要知道。
  • Django 框架 Django 是做Python Web开发常用的框架之一,其中表单字段的创建就使用到了工厂方法模式。forms模块支持不同类型的创建和定制。
三、什么情况下使用
  1. 需要将对象的使用和创建解耦的时候;
  2. 需要提高应用的性能和内存使用率的时候;
  3. 创建对象的代码分布在多个不同的地方,且不仅仅在一个方法中,导致无法跟踪这些对象的时候。
四、应用案例

下面我们使用代码演示以下工厂方法的使用,该例子将利用工厂方法解析xml和json文件

#使用python 自带的xml和json解析方法
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'):
        # 实例化Json解析类
        connector = JSONConnector
    elif filepath.endswith('xml'):
        # 实例化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.sp3')

    xml_factory = connect_to('data/contact_information.xml')
    xml_data = xml_factory.parsed_data
    persons = xml_data.findall(".//{}".format('person'))
    print('found: {} persons '.format(len(persons)))
    print('----------------------------------------------------')
    # 输出xml中的内容
    for ps in persons:
        print('姓名:{}'.format(ps.find('name').text))
        print('年龄:{}'.format(ps.find('age').text))
        for a in ps.find('addresses'):
            print('{}地址:{}'.format(a.attrib['type'], a.text))
        for p in ps.find('phoneNumbers'):
            print('{}电话:{}'.format(p.attrib['type'], p.text))
        print('----------------------------------------------------')
    json_factory = connect_to('data/donut.json')
    json_data = json_factory.parsed_data
    print('found:{} donuts '.format(len(json_data)))
    # 输出json内容
    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']]
        print('----------------------------------------------------')


if __name__ == '__main__':
    main()

在这段代码中表格,我们定义了两个类,一个是解析JSON文件的类,一个是解析XML文件的类,这两个类中都有一个共同的方法parsed_data,这个方法用来返回解析出来的数据。我们又定义了一个工厂方法connection_factory,通过判断文件的扩展名类实例化对应的解析类。main方法中,我们在调用的时候,只需向该方法传入文件的存储路径,这个方法便能返回一个我们需要的对象,然后处理这个对象,使对象内容在控制台输出。

源码下载地址:https://gitee.com/bugback/17Tian17SheJiMoShi
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、创建型模式
  • 一、工厂方法
  • 二、身边的例子
  • 三、什么情况下使用
  • 四、应用案例
    • 源码下载地址:https://gitee.com/bugback/17Tian17SheJiMoShi
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档