zoukankan      html  css  js  c++  java
  • 第一天:创建型模式--工厂方法模式

    零、创建型模式

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

    一、工厂方法

    • 什么是工厂方法:
      它是一个方法,对不同的输入参数返回不同的对象。在工厂方法模式中,我们执行单个函数,传入一个参数,并不要求知道任何关于对象如何实现以及来自哪里的细节

    二、身边的例子

    • 早点摊买粥
      我只需要告诉早点摊的老板要购买的粥的名字(比如皮蛋瘦肉粥),老板就会给我所购买的粥,具体这碗粥是怎么做出来的,以及是来自其他早点摊或者老板自己做的,这些我都不需要知道。
    • 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
  • 相关阅读:
    企业版证书打包APP发布,安装后闪退问题解决。
    Swift 与 Object-C 交互 (Swift版本为:1.2)
    iOS开发-代码片段(Code Snippets)提高开发效率
    iOS开发-Object-C可变参数函数
    MAC-Zsh安装与使用——终极Shell
    Git-学习笔记(常用命令集合)
    CSS动画,2D和3D模块
    CSS定位与布局
    CSS基础
    CSS概述
  • 原文地址:https://www.cnblogs.com/gangzhucoll/p/12778261.html
Copyright © 2011-2022 走看看