做网站要交百分七十定金,我的网站模板下载,手机网站开发实例,学做网站能找到工作么一、Python亨元模式介绍
概念#xff1a; 享元模式#xff08;Flyweight Pattern#xff09;是一种结构型设计模式#xff0c;用于减少创建对象的数量#xff0c;以提高应用程序的性能。享元模式通过共享尽可能多的数据来减少内存使用。
功能#xff1a; 享元模式的主要…一、Python亨元模式介绍
概念 享元模式Flyweight Pattern是一种结构型设计模式用于减少创建对象的数量以提高应用程序的性能。享元模式通过共享尽可能多的数据来减少内存使用。
功能 享元模式的主要功能是节省内存。
优点
减少内存使用。提高程序性能。对象共享可以降低程序的复杂度。
缺点
可能会导致代码复杂性增加。缓存的数据可能过多导致需要更多的内存。
应用场景
有大量的相似对象需要创建。对象的大部分属性可以共享相对稳定。需要缓存数据的应用程序。
使用方式
定义一个工厂类用于创建享元对象。定义享元对象接口。实现享元对象的具体类。在工厂类中按照需要维护享元对象的池子以便重用对象。在客户端中使用享元对象。
在应用程序开发中的应用
网络编程中可以使用享元模式来管理连接池。图像处理中可以使用享元模式来缓存图像对象以提高程序性能。对于需要创建大量相似对象的应用程序可以使用享元模式来减少内存使用。
二、亨元模式使用
工作原理 享元模式的工作原理是通过共享尽可能多的数据来减少内存使用。 在享元模式中创建对象的过程被分为两个阶段。 第一阶段创建对象并初始化所有属性。第二阶段所有属性被设置为共享属性以便在创建其他对象时可以共享这些属性。 通过这种方式一个对象可以通过多次使用相同的属性来减少内存使用。
示例一亨元模式创建相似对象的应用程序 我们以一个图书馆管理系统为例假设在该系统中有成千上万本书籍而这些书籍中大部分属性都是相同的例如书名、作者、出版社等信息只有少部分属性是不同的例如ISBN编码、出版日期等信息。如果我们为每本书都创建一个独立的对象将会占用大量的内存因此应该考虑使用享元模式来管理这些对象。
首先我们需要定义一个 Book 接口以便创建书籍对象并在接口中定义书籍属性的方法
接着我们定义一个具体的书籍类 BookImpl用于实现 Book 接口
接下来我们定义一个书籍工厂类 BookFactory用于创建和管理书籍对象
最后我们在客户端代码中使用 BookFactory 来创建和获取书籍对象
from abc import ABC,abstractmethod# ***************************************************************************使用亨元模式 创建大量相似对象的应用程序减少内存使用
class Book(ABC):书籍接口定义书籍属性 书名、作者、出版社abstractmethoddef get_book_name(self):passabstractmethoddef get_book_author(self):passabstractmethoddef 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(host192.168.1.***, port22, usernameroot, password123456)# 获取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 语句。最后我们将连接对象关闭并释放资源。
使用连接池可以有效地减少数据库连接的创建和销毁过程减少系统资源的占用提高程序的性能。