目录

一、单例模式的概述

二、单例模式的优缺点

三、在Python中,单例模式有以下几种实现方式

1.通过魔法方法__new__实现

2.通过模块的导入

3.通过装饰器实现

4.通过使用类实现


一、单例模式的概述

单例模式是一种常用的软件设计模式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

从具体实现角度来说,就是以下三点:

  • 1.单例模式的类只提供私有的构造函数,
  • 2.类定义中含有一个该类的静态私有对象,
  • 3.该类提供了一个静态的共有函数用于创建或获取它本身的静态私有对象。

二、单例模式的优缺点

优点:

(1) 由于单例模式在内存中只有一个实例,减少内存开支,特别是一个对象需要频繁地创建销毁时,而且创建或销毁时性能又无法优化,单例模式就非常明显了

(2) 由于单例模式只生成一个实例,所以,减少系统的性能开销,当一个对象产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

(3) 单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作

缺点:

(1) 单例模式没有抽象层,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。

(2) 单例类的职责过重,在一定程度上违背了“单一职责原则”。

(3) 滥用单例将带来一些负面问题,如:为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;

三、在Python中,单例模式有以下几种实现方式

1.通过魔法方法__new__实现

class Demo1(object):def __new__(cls, *args, **kwargs):#  判断单例是否存在:_instance属性中存储的就是单例if not hasattr(cls,'_instance'):# 如果单例不存在,初始化单例cls._instance= super(类名,cls).__new__(cls,*args,**kwargs)# 返回单例return cls._instance

2.通过模块的导入

# cls_singleton.py
class Foo(object):passinstance = Foo()# test.py
import cls_singletonobj1 = cls_singleton.instance
obj2 = cls_singleton.instance# 原理:模块第二次导入从内存找的机制

3.通过装饰器实现

def singleton(cls):# 创建一个字典用来保存类的实例对象_instance = {}def _singleton(*args, **kwargs):# 先判断这个类有没有对象if cls not in _instance:_instance[cls] = cls(*args, **kwargs)  # 创建一个对象,并保存到字典当中# 将实例对象返回return _instance[cls]return _singleton@singleton
class Demo3(object):a = 1def __init__(self, x=0):self.x = xa1 = Demo3(1)
a2 = Demo3(2)
print(id(a1))
print(id(a2))

4.通过使用类实现

class Demo4(object):# 静态变量_instance = None_flag = Falsedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instancedef __init__(self):if not Demo3._flag:Demo4._flag = True

单例模式(Python中的单例类)相关推荐

  1. 在Python中创建单例

    这个问题不是为了讨论是否需要单例设计模式 ,是否是反模式,还是针对任何宗教战争,而是要讨论如何以最pythonic的方式在Python中最好地实现此模式. 在这种情况下,我定义"最pytho ...

  2. python中的单例设计模式

    单例 -- 让 类 创建的对象,在系统中 只有 唯一的一个实例 定义一个 类属性,初始值是 None,用于记录 单例对象的引用 重写 __new__ 方法 如果 类属性 is None,调用父类方法分 ...

  3. python编程入门单例_常见的在Python中实现单例模式的三种方法

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

  4. python单例类命名_单例模式(java/python/c++)

    序 最近接触到新项目,后端基于java开发.对于有c++/python开发经验,无java经验的小梅同学,开始了漫漫学习之旅,第一篇学习记录,从最简单的单例模式开始吧. 众所周知,单例模式的最明显的几 ...

  5. python 模块 多线程 单例_python的单例模式

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

  6. python编程入门单例_Python单例模式实例详解

    本文实例讲述了Python单例模式.分享给大家供大家参考,具体如下: 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某个类只有一个实例的途径: 1,让一个全局变量使得一个对象被 ...

  7. java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式

    单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  8. 单例模式及单例类的两种实现

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

  9. java中的单例_细说Java中的几种单例模式

    在Java中,单例模式分为很多种,本人所了解的单例模式有以下几种,如有不全还请大家留言指点: 饿汉式 懒汉式/Double check(双重检索) 静态内部类 枚举单例 一.饿汉式 image 饿汉式 ...

最新文章

  1. 李兴球python创意编程视频云盘_A36_Python滚动的字幕_教学视频
  2. oracle asm和文件系统,Oracle工具之--ASM与文件系统及跨网络传输文件
  3. 算法题目——杨辉三角问题
  4. 您应该保持联系的十大高级Java对话
  5. 将训练集构建成ImageNet模型
  6. h5链接加上 vconsole_又出爆款!凯美瑞和红旗H5没法比!
  7. 如何通过VC的 CHttpFile 抓取网页内容
  8. 今天上网感觉有点儿卡,上了路由器一看,数据包狂跳
  9. 桶排序JAVA软件测试_111-堆排序的速度测试和小结
  10. aws rds监控慢sql_AWS RDS SQL Server的多可用区配置
  11. 怎么设置某个用户生成hdfs文件的权限_管理 HDFS 服务
  12. android优化 清除无效代码 UCDetector
  13. 阿里Sophix 集成
  14. adb 切换usb模式_利用adb命令打开usb调试
  15. 《老路用得上的商学课》56-60学习笔记
  16. spring框架 -- IOC
  17. pyinstaller 生成exe之后不报毒的终极方法(亲测可用)
  18. Linux 常用命令整理(Centos7) (时区/正则/sed/htop/screen/ln/awk/……)
  19. 5G智慧合杆的城市商业区应用
  20. JVM-13. 垃圾回收器

热门文章

  1. 【Shiro】6、Shiro实现限制密码错误次数从而限制用户登录
  2. python虚拟环境——pipenv
  3. Python 虚拟环境的使用
  4. VR购物Buy+是否会让线下实体店渐渐消亡?
  5. java 实例化list_java中List的用法和实例详解
  6. 21天好习惯第一期-3
  7. 易风神盾防火墙 v1.0 官方
  8. TFT-LCD制程之CF制程
  9. 数据库课程设计:图书借阅系统(Java+MySQL)
  10. 【转载】CU、PU、TU划分显示代码