Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式

此去经年,再难同游

------ 24.11.11

一、什么是设计模式

设计模式是一种编程套路,可以极大的方便程序的开发最常见、最经典的设计模式,就是我们所学习的面向对象了。

除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模式:

单例、工厂模式

建造者、责任链、状态、备忘录、解释器、访问者、观察者、中介、模板、代理模式

等等


二、单例模式

引出

创建类的实例后,就可以得到一个完整的、独立的类对象。

用同一个类创建多个类对象,类对象的内存地址是不相同的,即创建出的对象是完全独立的。


为何要使用单例模式

某些场景下,我们需要一个类无论获取多少次类对象,都仅仅提供一个具体的实例用以节省创建类对象的开销和内存开销

比如某些工具类,仅需要1个实例,即可在各处使用

这就是单例模式所要实现的效果


什么是单例模式

单例模式(Singleton Patter)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

**定义:**保证一个类只有一个实例,并提供一个访问它的全局访问点

**适用场景:**当一个类只能有一个实例,而客户可以从一个众所周知的访问点访问它时。


代码

非单例模式

python 复制代码
# 演示单例模式的效果

class StrTools:
    pass

s1 = StrTools()
s2 = StrTools()
print(s1)
print(s2)

# id函数展示变量具体的id
print(id(s1))
print(id(s2))

从地址和id值都不同,可以看出,虽然是同一个类创建出的两个对象,但是对内存资源造成了浪费


单例模式

StrTools类

首先定义一个类StrTools,以后创建对象从这个类中直接获取对象,全局只提供唯一一个实例用来创建对象,避免了重复构造大量对象导致的内存的浪费,节省内存开销和创建对象的开销

python 复制代码
class StrTools:
    pass

str_tool = StrTools()

test1

python 复制代码
from str_tools_py import str_tool

s1 = str_tool
s2 = str_tool

print(s1)
print(s2)

# id函数展示变量具体的id
print(id(s1))
print(id(s2))

test2

python 复制代码
from str_tools_py import str_tool

s1 = str_tool
s2 = str_tool

print(s1)
print(s2)

# id函数展示变量具体的id
print(id(s1))
print(id(s2))

可以看出,单例模式创建对象只需要用到同一个类进行创建,节省了内存开支

全局只提供唯一一个实例用来创建对象,避免了重复构造大量对象导致的内存的浪费,节省内存开销

相关推荐
非概念几秒前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
马剑威(威哥爱编程)29 分钟前
读写锁分离设计模式详解
java·设计模式·java-ee
修道-032331 分钟前
【JAVA】二、设计模式之策略模式
java·设计模式·策略模式
无敌最俊朗@1 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_2 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
L_cl2 小时前
Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程
学习
前端SkyRain2 小时前
后端Node学习项目-用户管理-增删改查
后端·学习·node.js
提笔惊蚂蚁2 小时前
结构化(经典)软件开发方法: 需求分析阶段+设计阶段
后端·学习·需求分析
DDDiccc2 小时前
JAVA学习日记(十五) 数据结构
数据结构·学习
G皮T4 小时前
【设计模式】结构型模式(四):组合模式、享元模式
java·设计模式·组合模式·享元模式·composite·flyweight