Python亨元模式介绍、使用

一、Python亨元模式介绍

概念:

        享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建对象的数量,以提高应用程序的性能。享元模式通过共享尽可能多的数据来减少内存使用。

功能: 享元模式的主要功能是节省内存。

优点:

  1. 减少内存使用。
  2. 提高程序性能。
  3. 对象共享可以降低程序的复杂度。

缺点:

  1. 可能会导致代码复杂性增加。
  2. 缓存的数据可能过多,导致需要更多的内存。

应用场景:

  1. 有大量的相似对象需要创建。
  2. 对象的大部分属性可以共享,相对稳定。
  3. 需要缓存数据的应用程序。

使用方式:

  1. 定义一个工厂类,用于创建享元对象。
  2. 定义享元对象接口。
  3. 实现享元对象的具体类。
  4. 在工厂类中按照需要维护享元对象的池子,以便重用对象。
  5. 在客户端中使用享元对象。

在应用程序开发中的应用:

  1. 网络编程中,可以使用享元模式来管理连接池。
  2. 图像处理中,可以使用享元模式来缓存图像对象,以提高程序性能。
  3. 对于需要创建大量相似对象的应用程序,可以使用享元模式来减少内存使用。

二、亨元模式使用

工作原理:

         享元模式的工作原理是通过共享尽可能多的数据来减少内存使用。

在享元模式中,创建对象的过程被分为两个阶段。

  1. 第一阶段,创建对象并初始化所有属性。
  2. 第二阶段,所有属性被设置为共享属性,以便在创建其他对象时可以共享这些属性。

通过这种方式,一个对象可以通过多次使用相同的属性来减少内存使用。

示例一:亨元模式创建相似对象的应用程序

        我们以一个图书馆管理系统为例,假设在该系统中有成千上万本书籍,而这些书籍中大部分属性都是相同的,例如书名、作者、出版社等信息,只有少部分属性是不同的,例如ISBN编码、出版日期等信息。如果我们为每本书都创建一个独立的对象,将会占用大量的内存,因此应该考虑使用享元模式来管理这些对象。

首先,我们需要定义一个 Book 接口,以便创建书籍对象,并在接口中定义书籍属性的方法:

接着,我们定义一个具体的书籍类 BookImpl,用于实现 Book 接口:

接下来,我们定义一个书籍工厂类 BookFactory,用于创建和管理书籍对象:

最后,我们在客户端代码中,使用 BookFactory 来创建和获取书籍对象:

from abc import ABC,abstractmethod# ***************************************************************************使用亨元模式 创建大量相似对象的应用程序,减少内存使用
class Book(ABC):'''书籍接口,定义书籍属性 书名、作者、出版社'''@abstractmethoddef get_book_name(self):pass@abstractmethoddef get_book_author(self):pass@abstractmethoddef get_book_publisher(self):passclass BookImpl(Book):'''定义具体书籍类,实现Book方法'''def __init__(self, name, author, publisher):self.name = nameself.author = authorself.publisher = publisherdef get_book_name(self):return self.namedef get_book_author(self):return self.authordef get_book_publisher(self):return self.publisherclass BookFactory():'''定义书籍工厂类,用于创建和管理书籍对象'''def __init__(self):self.books = {}def get_book(self, name, author, publisher):'''创建书籍对象,已存在相同属性的书籍对象,直接返回已有对象'''if (name, author, publisher) not in self.books:# 判断不存在相同的属性,将新的书籍添加到池子中self.books[(name, author, publisher)] = BookImpl(name, author, publisher)return self.books[(name, author, publisher)]# 创建书籍工厂对象
fac = BookFactory()
# 获取书籍
book1 = fac.get_book("book1", "author1", "pub1")
book2 = fac.get_book("book2", "author2", "pub2")
book3 = fac.get_book("book3", "author3", "pub3")
# 打印书籍信息
print(book1.get_book_name(), book1.get_book_author(), book1.get_book_publisher())
print(book2.get_book_name())
print(book3.get_book_name())

运行结果:

book1 author1 pub1
book2
book3

在上面的代码中,我们创建了三本书籍对象,并打印了它们的属性。在创建书籍对象时,我们使用了 BookFactory 来管理书籍对象的池子,以便重用已经存在的对象。通过共享相同属性的对象,我们可以减少内存的使用,提高程序的性能。

示例二:享元模式实现管理ssh连接池功能

        在实际应用中,享元模式通常用于管理大量的共享对象,例如线程池、连接池等。下面我们以连接池为例,来说明如何使用 Python 实现连接池的功能。

连接池是一种常见的数据库连接管理方式。在传统的数据库连接方式中,每次需要连接数据库时,都会重新创建一个数据库连接对象。这样会消耗大量的系统资源,并且每次创建连接对象都需要进行一系列的初始化工作,导致连接对象的创建速度比较缓慢。而使用连接池,则可以通过共享连接对象来提高程序的性能。

首先,我们需要定义一个数据库连接池 ConnectionPool 类,其中包含两个方法:init() 方法用于初始化连接池对象,create_connection() 方法用于创建数据库连接对象。

其中,max_connections 参数表示连接池中最大的连接数,如果连接池中已经存在 max_connections 个连接对象,则直接返回第一个连接对象。如果连接池中的连接对象不足 max_connections 个,则创建一个新的连接对象,并添加到连接池中。

接下来,我们在客户端代码中,通过 ConnectionPool 来获取连接对象:

import paramikoclass SSHConnectionPool():'''SSH 连接池'''def __init__(self, host, port, username, password, max_connection = 10):# 初始化连接池对象self.host = hostself.port = portself.username = usernameself.password = passwordself.max_connection = max_connectionself.connections = []def create_connection(self):# 创建ssh对象if len(self.connections) < self.max_connection:conn = paramiko.SSHClient()conn.set_missing_host_key_policy(paramiko.AutoAddPolicy)conn.connect(self.host, self.port, self.username, self.password)self.connections.append(conn)else:conn = self.connections.pop(0)return conn# 创建连接池对象
pool = SSHConnectionPool(host="192.168.1.***", port=22, username="root", password="123456")# 获取SSH连接对象
conn1 = pool.create_connection()
conn2 = pool.create_connection()
conn3 = pool.create_connection()# 执行命令
stdin, stdout, stderr = conn1.exec_command("ls")
print(stdout.readlines())# 关闭连接
conn1.close()
conn2.close()
conn3.close()

运行结果:

['anaconda-ks.cfg\n', 'Desktop\n', 'Documents\n', 'Downloads\n', 'ifconfig_20230607.txt\n', 'initial-setup-ks.cfg\n', 'kmod-r8125-9.003.05-1.el7_8.elrepo.x86_64.rpm\n', 'Music\n', 'Pictures\n', 'Public\n', 'Templates\n', 'test\n', 'Videos\n']
 

在上面的代码中,我们创建了一个连接池对象 pool,并获取了三个连接对象 conn1、conn2、conn3。通过连接对象获取游标对象,并执行 SQL 语句。最后,我们将连接对象关闭,并释放资源。

使用连接池可以有效地减少数据库连接的创建和销毁过程,减少系统资源的占用,提高程序的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直播带货app开发开发流程分析

随着小视频管理体系愈来愈变成人们的生活中的一部分&#xff0c;也随之短视频卖货逐步形成岗位内主流的转现方式&#xff0c;将短视频平台生产制造变成短视频带货体系计划愈来愈多&#xff0c;那样&#xff0c;把小视频管理体系开发设计变成短视频带货体系必须两步&#xff1f;…

谷粒商城篇章5 ---- P173-P192 ---- 检索服务【分布式高级篇二】

目录 1 检索服务 1.1 搭建页面环境 1.1.1 引入依赖 1.1.2 将检索页面放到gulimall-search的src/main/resources/templates/目录下 1.1.3 调整搜索页面 1.1.4 将静态资源放到linux的nginx相关映射目录下/root/docker/nginx/html/static/ search/ 1.1.5 SwitchHosts配置域…

SpringBoot - WebMvcConfigurer的作用是什么

WebMvcConfigurer是一个接口&#xff0c;用于配置全局的SpringMVC的相关属性&#xff0c;采用JAVABEAN的方式来代替传统的XML配置文件&#xff0c;提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。 WebMvcConfigurer 在 Spring Boot 2.x 中官方建议…

疲劳驾驶检测和识别3:Android实现疲劳驾驶检测和识别(含源码,可实时检测)

疲劳驾驶检测和识别3&#xff1a;Android实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 目录 疲劳驾驶检测和识别3&#xff1a;Android实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 1.疲劳驾驶检测和识别方法 2.人脸检测方法 3.疲劳驾驶检测和识别模型…

《人工智能安全》课程总体结构

1 课程内容 人工智能安全观&#xff1a;人工智能安全问题、安全属性、技术体系等基本问题进行了归纳整理。人工智能安全的主要数据处理方法&#xff0c;即非平衡数据分类、噪声数据处理和小样本学习。人工智能技术赋能网络空间安全攻击与防御&#xff1a;三个典型实例及攻击图…

QT在线安装程序下载链接

最新版本 Download Qt OSS: Get Qt Online Installer 安装时&#xff0c;可以选择不同的QT SDK版本。 源码下载版本 https://download.qt.io/archive/qt/

【Oracle系列】- Oracle数据迁移

【Oracle系列】- Oracle数据迁移 文章目录 【Oracle系列】- Oracle数据迁移一、概述二、数据迁移方案三、模拟迁移方案四、迁移步骤五、迁移方案及其实施细则5.1 exp/imp逻辑备份与恢复5.2 Storage存储迁移5.3 利用data guard迁移 一、概述 最近在做公司软件系统盘点时&#x…

Android中保持屏幕常亮的三种使用方法

目录 一、设置Flag 二、使用View类中的属性方法 1、Xml布局中设置&#xff1a; 2、功能代码中设置&#xff1a; 三、Wakelock 锁定机制 1、简介 2、作用 3、分类标志 4、使用方法 &#xff08;1&#xff09;在AndroidManifest.xml中设置权限 &#xff08;2&#xff0…

Vue异步更新、$nextTick

需求&#xff1a;编辑标题, 编辑框自动聚焦 1. 点击编辑&#xff0c;显示编辑框 2. 让编辑框&#xff0c; 立刻获取焦点 this. isShowEdit true // 显示输入框 this . $refs . inp . focus () // 获取焦点 问题&#xff1a;"显示之后"&#xff0c;立刻获…

24 鼠标常用事件

鼠标进入&#xff1a;enterEvent鼠标离开&#xff1a;leaveEvent鼠标按下&#xff1a;mousePressEvent鼠标释放&#xff1a;mouseRelaseEvent鼠标移动&#xff1a;mouseMoveEvent 提升为自定义控件MyLabel 代码&#xff1a; //mylabel.h #ifndef MYLABEL_H #define MYLABEL_H#…

易班开放应用授权重定向,出现跨域的解决方案

问题描述 今天开发H5网站需要接入易班&#xff0c;经过易班授权然后重定向&#xff08;code: 302&#xff09;&#xff0c;使用axios发请求&#xff0c;但是前后端均配置跨域的情况下&#xff0c;不管怎么弄都是一直跨域 但是我们看network&#xff0c;network中对应请求的res…

微服务初始

今天准备开始学习微服务&#xff0c;使用微服务肯定是因为他有好处。 首先了解到的三种架构&#xff0c;传统单体&#xff0c;集群架构&#xff0c;微服务架构 单体架构 有单点问题&#xff0c;如果宕机所有的服务都不可用所有业务的功能模块都聚集在一起&#xff0c;如果代…

tinkerCAD案例:9. Saw Shaped Wrench 锯形扳手

tinkerCAD案例&#xff1a;9. Saw Shaped Wrench 锯形扳手 ln this lesson you will learn how to create a cool saw shaped wrench. 在本课中&#xff0c;您将学习如何制作一个很酷的锯形扳手。 Start the lesson by dragging a polygon to the workplane. 通过将多边形拖动…

Windows实现端口转发(附配置过程图文详解)

文章目录 1. 前言2. 命令提示符3. 防火墙4. netsh 命令4.1 查看已有的转发规则4.2 新增转发规则4.3 删除转发规则 5. 图解汇总6. 欢迎纠正~ 1. 前言 利用Windows端口转发&#xff0c;实现本地设备 ⬅➡ 公网主机 ⬅➡ 远端服务器 2. 命令提示符 以管理员身份打开“命令提示…

python调用百度ai将图片识别为表格excel

python调用百度ai将图片识别为表格excel ocr ocr 百度ai官方文档&#xff1a;https://ai.baidu.com/ai-doc/OCR/Ik3h7y238 import requests import json import base64 import time文档&#xff1a;https://ai.baidu.com/ai-doc/OCR/Ik3h7y238 # 获取access_token def get_acc…

vue3+ts+element-plus 之使用node.js对接mysql进行表格数据展示

vue3tselement-plus axiosnode.jsmysql开发管理系统之表格展示 ✏️ 1. 新建一个node项目* 初始化node* 安装可能用到的依赖* 配置文件目录* 添加路由router1. 添加router.js文件&#xff0c;添加一个test目录2. 修改app.js ,引入router&#x1f4d2; 3. 启动并在浏览器打开 * …

【1++的C++初阶】之适配器

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;什么是适配器二&#xff0c;栈与队列模拟实现三&#xff0c;优先级队列四&#xff0c;reverse_iterator 一&#xff0c;什么是适配器 适配器作为STL的六大组…

哪些油封密封件可用于旋转轴?

哪些密封件可用于旋转轴?当考虑可用于有效密封旋转轴的各种选项时&#xff0c;就会出现这个问题。选择合适的密封件取决于几个因素&#xff0c;包括应用的性质、操作条件和所需的密封性能水平。 一种常用的旋转轴密封件是唇形密封件&#xff0c;也称为径向轴密封件。唇形密封…

PHP类与对象 (基础)

文章目录 PHP之 类与对象 &#xff08;基础&#xff09;简介类的概念以及特点对象的概念以及特点类与对象的关系类与对象的意义 PHP中类的基本概念PHP中类常用的操作符类属性和类方法PHP中类的分类class声明类的封装类的属性类的公共方法&#xff08;函数&#xff09;构造函数析…

【爬虫逆向案例】某道翻译js逆向—— sign解密

声明&#xff1a;本文只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 【爬虫逆向案例】某道翻译js逆向—— sign解密 1、前言2、步骤3、源码4、号外 1、前言 相信各位小伙伴在写…