python设计模式之一-单例模式

引言

在面向对象的世界里,对象是对客观事物的抽象,类是对对象的抽象。它们之间的关系是,对象是类的实例,类是对象的模板。

这段文字表述起来费劲,理解起来也费劲,还是讲生活中的例子吧。比如说“大河”,一联想到这个词,不同的人脑海中的印象是不一样的,有的是“大漠孤烟直,长河落日圆”,有的是“春江潮水连海平,海上明月共潮生”,有的是“星垂平野阔,月涌大江流”。在这个例子中,大河可以认为是一个类,大河具有所有河流的共性特征,如有河堤,有长度,会流向大海等特性,而几句诗中的“石羊河”、“浏阳河”、“长江”等分别是大河的一个实例化对象。

在大河的例子中,一个大河类可以有多个不同的实例。可是,我们今天的主角-单例模式,应用单例模式的类却只能有一个实例。

比如我们常见的操作系统的任务管理器,它就是一个单例模式的实现。

定义

单例模式(singleton pattern):确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
这个定义有三个要点

  1. 某个类只能有一个实例
  2. 类应当自行创建这个实例
  3. 它必须向整个系统提供这个实例

UML结构


角色:单例本身

优缺点

优点
  1. 应用单例模式实例化类在应用程序域中只存在一个对象,满足业务需要的同时,无疑也能降低内存消耗,提高计算机性能。
  2. 由于实例化的过程由类本身完成,可方便地选择实例时机。
缺点
  1. 由于单例模式通常为单一类且不允许继承,所以它的扩展能力受限。
  2. 由于上一点的原因,单例类通常承载了过多的职能,违反了单一职责原则。

实例

Lilei和Hanmeimei经过多年的爱情长跑,终于迈入婚姻的殿堂。婚后不久,就有了爱情的结晶,小朋友名叫LittleMango。

class SingletonBase(type):
    def __init__(self,*args,**kwargs):
        self._instance=None
        super().__init__(*args,**kwargs)
    def __call__(self,*args,**kwargs):
        if self._instance is None:
            self._instance=super(SingletonBase,self).__call__(*args,**kwargs)
        return self._instance

class LittleMango(metaclass=SingletonBase):
    def show_my_age(self):
        print('I\'m 5 years old')

if __name__ == "__main__":
    s1=LittleMango()
    s2=LittleMango()
    print('s1:',id(s1))
    print('s2:',id(s2))
    
s1: 800311678008
s2: 800311678008

通过上面的实例,我们看见s1和s2引用了同一个内存地址,这样,我们就实现了单例模式。在项目应用中,如果把SingletonBase封装起来,需要实现单例模式的地方继承此类即可。

原文链接

原文地址:https://www.cnblogs.com/zhouXX/p/10099998.html

时间: 2024-10-25 14:26:38

python设计模式之一-单例模式的相关文章

python 设计模式之 单例模式

单例模式是做为"全局变量"的替代品出现的.所以它具有全局变量的特点:全局可见.贯穿应用程序的整个生命期,保证在程序执行中,某个类仅仅存在一个实例,所以通常不希望类中的构造函数被调用 python: class Single(object): instance = None # def __init__(self): pass # def getInstance(self): if Single.instance == None: Single.instance = Single() r

Python设计模式之单例模式

单例模式 单例模式需要注意的地方在于 如何保证创建的实例是唯一的 如何保证多线程情况下的访问 清晰明了 目前有这么几种方法: module metaclass __new__ decorator module 其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码.因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了.如果我们真的想要一个单例类,可以考虑这样做: 首先

python设计模式之--单例模式

python的单例模式就是一个类的实例只能自始自终自能创建一次.应用场景比如说数据库的连接池. #!/usr/bin/env python # coding=utf-8 class Foo(object): instance = None def __init__(self, name): self.name = name @classmethod def get_instance(cls): if cls.instance: return cls.instance else: obj = cl

Python设计模式中单例模式的实现及在Tornado中的应用

单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def new(cls, *args): if not isinstance(cls._instance, cls): cls._instance = super(Singleton, cls).__new__(cls, *args) return cls._instance 但是子类在继承后可以重写__new__以失去单例特性 class D(Singleton):

设计模式之单例模式与工厂模式的Python实现(一)

1. 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息.如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述,基本分类 如下图所示: 类成员包括字段,方法,和属性 2.字段 如上图字段分为普通字段和静态字段,两者的使用有区别,但是最大的区别在于两者在内存中的保存位置有区别. 普通字段属于对象而静态字段属于类,在使用过程中谁的字段就由谁来调用. 静态字段和普通字段的定义如下: 在调用时分各自调用 #####类

Python新式类 单例模式与作用域(四)

1 新式类与旧式类 新式类拥有经典类的全部特性之外,还有一些新的特性,比如 __init__发生变化,新增了静态方法__new__,python3目前都采用新式类,新式类是广度优先,旧式类是深度优先 #新式类 class C(object): pass #经典类 class B: pass (1)内置的object对象 1. __new__,__init__方法 这两个方法是用来创建object的子类对象,静态方法__new__()用来创建类的实例,然后再调用 __init__()来初始化实例.

python设计模式之门面模式

一.结构型设计模式 门面模式与单例模式,工厂模式不同,它是一种结构型模式. 结构型模式描述如何将对象和类组合成更大的结构 结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之间的关系. 结构型模式是类和对象模式的综合体.类模式通过继承来描述抽象,从而提供更有用的程序接口,而对象模式描述了如何将对象联系起来从而组合成更大的对象. 二.理解门面设计模式 它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更简单的方式使用子系统. 门面所解决的问题是,

Java设计模式:单例模式

概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能