第一天:创建型模式--工厂方法模式
时间:2022-07-24
本文章向大家介绍第一天:创建型模式--工厂方法模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
零、创建型模式
开篇先简单说一下创建型模式,它关注对象的创建过程,将类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。使得相同的创建过程可以多次复用,且修改二者中的任一个对另一个几乎不造成任何影响。 创建型模式有五种:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。这里面我们只讲常用的工厂方法模式、抽象工厂模式和原型模式。
一、工厂方法
- 什么是工厂方法: 它是一个方法,对不同的输入参数返回不同的对象。在工厂方法模式中,我们执行单个函数,传入一个参数,并不要求知道任何关于对象如何实现以及来自哪里的细节
二、身边的例子
- 早点摊买粥 我只需要告诉早点摊的老板要购买的粥的名字(比如皮蛋瘦肉粥),老板就会给我所购买的粥,具体这碗粥是怎么做出来的,以及是来自其他早点摊或者老板自己做的,这些我都不需要知道。
- 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
- 【JavaScript】 JS面向对象的模式与实践
- log4j:ERROR Failed to load driver
- 前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
- 前端MVC Vue2学习总结(六)——axios与跨域HTTP请求、Lodash工具库
- spring之config.xml完整版示例
- 前端MVC Vue2学习总结(五)——表单输入绑定、组件
- 【HCTF】2017部分Web出题思路详解
- 前端MVC Vue2学习总结(四)——条件渲染、列表渲染、事件处理器
- 如何移除Android应用广告
- 前端MVC Vue2学习总结(三)——模板语法、过滤器、计算属性、观察者、Class 与 Style 绑定
- 前端MVC Vue2学习总结(二)——Vue的实例、生命周期与Vue脚手架(vue-cli)
- hive具体操作
- hive中配置hwi
- 从零开始内网安全渗透学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis入坟(番外篇)配置文件redis.conf,解析每个参数的含义
- 使用OpenCV自动去除背景色
- Redis入坟(四)Redis内存回收知多少
- Redis入坟(五)持久化
- Python爬取杜赛博客教程内容,应用pdfkit打印pdf文件
- Java程序员必须知道的常用序列化技术及选型,Protobuf 原理详解
- Python异步编程之 协程 & asyncio & 异步
- Redis入坟(八)内存管理与优化,面试必考
- 逐行阅读Spring5.X源码(十二)AOP源码分析,难!面试官都不一定懂!
- 逐行阅读Spring5.X源码(十三)spring事务源码分析
- 线程池ThreadPoolExecutor 源码分析,面试官也就那么回事,他怎么敢!
- Spug - 轻量级自动化运维平台
- Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
- 优雅的drop掉mysql库中1TB大表
- 《剑指offer》第19天:股票交易(校对)