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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 第一天:创建型模式--工厂方法模式

####零、创建型模式


开篇先简单说一下创建型模式,它关注对象的创建过程,将类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。使得相同的创建过程可以多次复用,且修改二者中的任一个对另一个几乎不造成任何影响。

创建型模式有五种:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。这里面我们只讲常用的工厂方法模式、抽象工厂模式和原型模式。


####一、工厂方法


  • 什么是工厂方法:

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


####二、身边的例子


  • 早点摊买粥

我只需要告诉早点摊的老板要购买的粥的名字(比如皮蛋瘦肉粥),老板就会给我所购买的粥,具体这碗粥是怎么做出来的,以及是来自其他早点摊或者老板自己做的,这些我都不需要知道。

  • Django 框架

Django 是做Python Web开发常用的框架之一,其中表单字段的创建就使用到了工厂方法模式。forms模块支持不同类型的创建和定制。


####三、什么情况下使用


需要将对象的使用和创建解耦的时候;

需要提高应用的性能和内存使用率的时候;

创建对象的代码分布在多个不同的地方,且不仅仅在一个方法中,导致无法跟踪这些对象的时候。


####四、应用案例


下面我们使用代码演示以下工厂方法的使用,该例子将利用工厂方法解析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


目录
相关文章
|
1月前
|
设计模式 C#
C# 一分钟浅谈:工厂模式与抽象工厂模式
【10月更文挑战第10天】本文介绍了面向对象编程中的两种常见创建型设计模式:工厂模式和抽象工厂模式。工厂模式通过共同接口创建对象,隐藏创建逻辑,提高封装性和扩展性;抽象工厂模式则提供了一系列相关对象的创建接口,适用于多个相关产品族的创建。文章通过C#代码示例详细解释了这两种模式的实现和应用场景,并讨论了它们的优点、缺点及常见问题。
57 19
|
3月前
|
设计模式 uml
工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结
工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结
|
6月前
|
设计模式
工厂模式与抽象工厂模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见 工厂模式 工厂模式是一种创建型设计模式。在工厂模式中,类的实例化过程通常是通过一个专门的工厂类来完成的,而不是直接在客户端代码中进行的。这样可以提供更好的封装,使得客户端代码与具体产品的实现解耦,增加代码的灵活性和可维护性。 优点 封装性:客户端代码不再需要知道所创建对象的详细信息,只需要与工厂接口进行交互即可。 灵活性:工厂模式使得系统更加灵活,可以在不修改客户端代码的情况下更换或添加新产品。 可扩展性:通过使用工厂模式,当需要添加新产品时,只需要扩展工厂类,而不需要修改客户端代码。 基本结构 抽象产品(Abstra
53 0
|
设计模式 Java Spring
设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式
Spring Boot 的学习先告一段落,我们先温习下相关设计模式。我们先学习下简单工厂模式和工厂方法模式。
110 0
设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式
简单的工厂模式和工厂方法模式
简单的工厂模式和工厂方法模式
|
设计模式 Java
Java设计模式-工厂模式(2)工厂方法模式
Java设计模式-工厂模式(2)工厂方法模式
202 0
Java设计模式-工厂模式(2)工厂方法模式
|
设计模式 Java
Java设计模式-工厂模式(3)抽象工厂模式
Java设计模式-工厂模式(3)抽象工厂模式
171 0
Java设计模式-工厂模式(3)抽象工厂模式
|
设计模式 Oracle Java
【玩转23种Java设计模式】创建型模式篇:工厂方法模式
工厂方法模式,是⼀种创建型设计模式。定义一个用于创建产品的接口,由子类决定生产什么产品。
【玩转23种Java设计模式】创建型模式篇:工厂方法模式
|
设计模式 Java
【玩转23种Java设计模式】创建型模式篇:抽象工厂模式
抽象工厂模式提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
【玩转23种Java设计模式】创建型模式篇:抽象工厂模式
|
设计模式 Java Android开发
Java设计模式——工厂模式与抽象工厂模式
Java设计模式——工厂模式与抽象工厂模式
121 0
Java设计模式——工厂模式与抽象工厂模式