分分钟带你理解单例

单例模式的讲解以及用处

什么是单例模式用处何在?

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

举个列子!!

比如、某个服务器程序的配置信息存放在一个文件中,客户端通过一个AppConfig的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建AppConfig对象实列,这就导致系统中存在多个AppConfig的实列对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下,事实上类似AppConfig这样的类,我们希望在程序运行期间只存在一个实例对象。

用 __new__来创建单例

如果想使得某个类从始至终最多只有一个实例,使用__new__方法会很简单,Python中类是通过__new__来创建实例的。

 1 class A(object):
 2     def __new__(cls, *args, **kwargs):
 3         if not hasattr(cls,‘_inst‘):
 4             cls._inst = super(A, cls).__new__(cls, *args, **kwargs)
 5         return cls._inst
 6 if __name__ == ‘__main__‘:
 7     class B(A):
 8         def __init__(self,s):
 9             self.s = s
10     ret = A()
11     ret1 = B(‘two‘)
12     print id(ret),ret
13     print id(ret1),ret1.s
14
15 #结果
16 53445264 <__main__.A object at 0x032F8290>
17 53445392 two

通过__new__方法,将类的实例在创建的时候绑定到类属性_inst,如果cls._inst为None,说明类还没实例化,实列化并将实例绑定到cls._inst,以后每次实例化的时候都返回第一次实列化创建的实例,注意从A派生子类的时候,不要重载__new__。

时间: 2024-08-06 16:49:10

分分钟带你理解单例的相关文章

深入谈谈Java最简单的单例设计模式

单例设计模式是23种设计模式里面最简单的,但是要彻底理解单例,还是需要下一点功夫的. 单例一般会分为饿汉模式和懒汉模式 饿汉模式: 1 public class Singleton 2 { 3 private static Singleton singleton = new Singleton(); 4 5 public static Singleton getInstance() 6 { 7 return singleton; 8 } 9 } 但是在一些系统应用环境中,这个单例对象可能比较大,

单例的扩展性讨论

在上一篇中,讨论了单例的4种基本形态,这次我们来探讨单例的变形. 1.有限个数的单例形式.即这个对象可能有多个,从这个角度上说,它其实不属于单例,但实现方式确是以单例为基础的.它通常是以带参数的getInstance(或其变型)存在. public class MultiInstanceDemo { private String mType; private MultiInstanceDemo(String type) { mType = type; } //单例 //每种类型限制只能有一个实例

设计模式理解(二)创建型——单例、原型

设计模式理解(二)单例(Singleton)与原型(Prototype) 为什么一起写,因为懒.... 单例,就是用了面向对象语言的一些奇技淫巧,把构造函数私有了,然后用一个自身类型的静态指针作为全局唯一的实例的引用.碰到并发之类就呵呵了. 这么简单都能画个UML图,还煞有介事似的,我晕. -----------------------   分割线   ------------------------ 原型(Prototype) 我理解就是给一个类糊弄个cloneable之类的接口,让它自己决定

Spring Bean注入/单例理解/循环依赖

理解循环依赖问题,首先明白spring有四种注入方式. 第一种,SET注入a类中持有b类的引用,并且a类有b的set方法.在bean中添加<property>标签即可注入.实质上是将b实例化,然后调用set方法注入. <bean id="a" class="com.qunar.pojo.StudentA" scope="singleton"> <property name="studentB" r

深入理解单例模式:静态内部类单例原理

本文主要介绍java的单例模式,以及详细剖析静态内部类之所以能够实现单例的原理.OK,废话不多说,进入正文. 首先我们要先了解下单例的四大原则: 1.构造私有. 2.以静态方法或者枚举返回实例. 3.确保实例只有一个,尤其是多线程环境. 4.确保反序列换时不会重新构建对象. 我们常用的单例模式有: 饿汉模式.懒汉模式.双重锁懒汉模式.静态内部类模式.枚举模式,我们来逐一分析下这些模式的区别. 1.饿汉模式: public class SingleTon{ private static Singl

Java中Class和单例类的作用与类成员的理解

Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存这些信息的类称为Class.可能容易产生混淆,容易想到class.不过二者没什么关系,class不过是描述类的一个关键字.而Class却是保存着运行时信息的类. 它能做什么?Class类可以帮助我们在程序运行时分析类,说白了就是获取类中的值.可能瞬间就想到了反射,没错!Class一般就是和反射配套使

从别人写的 Object-C 中 Singleton (单例) 模式 中的一些理解--备

关于 面向对象的设计模式 对于面向对象的设计模式,想必大家并不陌生吧. 纵观23种设计模式中,数单例模式(Singleton)和工厂模式(Factory Method)最为熟悉和基础吧.当然,本文总结Singleton模式,对于其他设计模式不做叙说. Singleton模式,即单例模式.顾名思义,主要用于做应用程序的资源共享控制.用途很多?? 实质为,单例是在程序声明周期里 有且仅有 被实例化过一次的类.为确保实例化的唯一,利用类的 类(static)方法来生成和访问对象. 至此,你便可以在程序

OC学习-单例设计模式的理解、案例和简单总结

单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例.为什么?有什么好处? 简单来说: a:有的东西只能有一个,那就必须用单例: b:单例的好处就是不会有多余的实例,所以节约内存: c:因为只有一个单例,所以易于管理多线程对它的访问. d:其他的原因……省略 我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy.retain这些,再看看它们是否是同一个实例,还是被创建出多个实例? (1)User.h view so

java:单例的理解

前言:Java的单例经常用到,今天发现自己有一点新的认识. 懒汉式单例 package com.mwq.singleton; public class Singleton1 { private Singleton1() { } private static Singleton1 single = null; public static Singleton1 getInstance() { if (single == null) { return new Singleton1(); } retur