单例模式

简介: 单例模式

一、简介

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在,并提供全局访问点。因此,单例模式通常用于日志记录、数据库操作、打印机后台及其他程序---该程序只生成一个实例,以避免对同一资源产生相互冲突的请求。

简言之,单例设计模式的意图如下:

1

2

3

确保类有且只有一个对象被创建

为对象提供一个访问点,以使程序可以全局访问该对象

控制共享资源的并行访问

利用Python实现经典的单例模式:(使用__new__方法)

new方法为python实例化创建对象自动执行的函数,通过重写这个函数,使之先判断该类中是否有instance属性(利用反射),若没有则为创建一个对象并为该属性赋值,最后返回instance中的对象。通过这种方式我们实现了每次创建实例返回的都是类中的instance的值。

单例模式之懒汉式实例化

单例模式的用例之一就是懒汉式实例化。例如,在导入模块的时候,我们可能会无意中创建一个对象,但时却根本用不到他、懒汉式实例化能够确保在需要时才创建对象

感觉像是手动完成单例创建逻辑,但注意获得实例一定要调用Singleton.getInstance()方法,直接s=Singleton()相当于没用单例

Monostate单例模式:

这种模式的理念为:实例化的对象是不同的,但是对象的状态,属性是相同的,也就是单态模式

这里的实现方式为利用类中的dict方法,我感觉是将_shared_state赋给dict后,每个对象的dict的地址都是相同的,所以对象的属性存储的位置都相同,那么一个对象的属性变化,其余的属性也会发生变化      

元类单例模式:

执行Loggre后,首先会调用MetaSingleton中的call函数,如果Singleton类没有在instance中,则为其创建一个实例,也就是正常调用type中的call函数,将返回的对象存在instance中,以该类名为键,对象为值,最后返回这个对象,若instance中有该类,那就直接返回存储的对象。 这种方式我觉得较好,不用为每个类单独创建单例模式,只需将元类重写即可

元类参考链接:https://www.cnblogs.com/yssjun/p/9832526.html

用 __call__() 弥补 hasattr() 函数的短板

hasattr() 函数的功能是查找类的实例对象中是否包含指定名称的属性或者方法,但该函数有一个缺陷,即它无法判断该指定的名称,到底是类属性还是类方法。


要解决这个问题,我们可以借助可调用对象的概念。要知道,类实例对象包含的方法,其实也属于可调用对象,但类属性却不是。举个例子:

可以看到,由于 name 是类属性,它没有以 call 为名的 call() 方法;而 say 是类方法,它是可调用对象,因此它有 call() 方法。

另外,我们可以通过__call__中调用我们想要调用的方法。参数传递可以利用*args和**kwards。

 

相关文章
|
4月前
|
设计模式 安全 测试技术
【C++】—— 单例模式详解
【C++】—— 单例模式详解
|
4月前
|
设计模式 安全
详细讲解什么是单例模式
详细讲解什么是单例模式
|
3月前
|
设计模式 安全 Java
单例模式分享
单例模式分享
14 0
|
4月前
|
设计模式 安全 Java
单例模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见,同时文中给出大部分的示例 如果觉得本文写的不错,不妨点个赞,收藏一下,助力博主产生质量更高的作品 概念 单例模式(Singleton Pattern)是软件设计模式的一种,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于需要频繁创建和销毁同一对象的场景,以减少系统资源的消耗和提高性能。 优缺点 优点: 实例控制:单例模式确保类只有一个实例,可以防止其他对象实例化自己的副本,从而确保所有对象都访问唯一实例。 节约资源:由于系统中只存在一个对象,可以节约系统资源,特别是在需要频繁创建和销毁对象的场景中,可
44 0
|
4月前
|
安全 C++
C++单例模式
C++单例模式
47 1
|
12月前
|
设计模式 安全 Java
单例模式的运用
单例模式的运用
36 0
|
安全 Java
单例模式很简单
《基础系列》
108 0
单例模式很简单
|
设计模式 安全 Java
回顾一下单例模式
回顾一下单例模式
|
设计模式 缓存
我学会了,单例模式
单例模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。
120 0
我学会了,单例模式
|
设计模式 数据库 Python