分分钟带你理解单例

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

单例模式的讲解以及用处

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

答:单例模式(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__。

相关文章
|
6月前
|
设计模式
单例设计模式步骤
单例设计模式步骤
35 1
|
6月前
|
消息中间件 安全 Java
面试官:单例Bean一定不安全吗?实际工作中如何处理此问题?
面试官:单例Bean一定不安全吗?实际工作中如何处理此问题?
103 5
|
设计模式 存储 安全
八种创建单例模式的方式-懒汉式与饿汉式及枚举
八种创建单例模式的方式-懒汉式与饿汉式及枚举
121 2
|
5月前
|
设计模式 存储 Java
JavaSE——面向对象高级一(2/4)-饿汉式单例、懒汉式单例、代码块、static的注意事项
JavaSE——面向对象高级一(2/4)-饿汉式单例、懒汉式单例、代码块、static的注意事项
31 0
|
6月前
单例模式例子
单例模式例子
|
设计模式 Java 应用服务中间件
不是单例的单例——巧用ClassLoader
本文通过如何将一个单例类实例化两次的案例,用代码实践来引入 Java 类加载器相关的概念与工作机制。理解并熟练掌握相关知识之后可以扩宽解决问题的思路,另辟蹊径,达到目的。
5789 1
|
设计模式
单例模式的懒汉模式为什么在高并发中会出现问题?一个代码例子告诉你
单例模式的懒汉模式为什么在高并发中会出现问题?一个代码例子告诉你
102 0
单例模式的懒汉模式为什么在高并发中会出现问题?一个代码例子告诉你
|
SQL Java
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现
164 0
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现
|
设计模式 存储 索引
单例设计、多例设计、工厂设计模式、枚举的介绍及使用
单例设计、多例设计、工厂设计模式、枚举的介绍及使用
143 0
|
C# 图形学
U3D客户端框架之基于类对象池的可回收变量代码实现
可回收变量 是基于引用计数去做的管理,基类实现了引用计数增加,和释放功能,当调用引用计数增加函数时,引用计数+1;当调用释放函数时候,引用计数-1,当引用计数==0的时候,类对象池会把该可回收变量对象回收。