#引入

一个类被设计出来,就意味着它具有某种行为(方法),属性(成员变量)。一般情况下,当我们想使用这个类时,会使用new 关键字,这时候jvm会帮我们构造一个该类的实例。这么做会比较耗费资源。

如果能在jvm启动时就new好,或者是某一次new好后以后再也不用new了,这样就能节省很多资源了。

这就是单例模式要解决的问题。

# 单例实现步骤

要实现一个单例类,需要经过三个步骤:

1、私有化构造函数,目的是避免其它类可以创建这个类的对象;

2、在本类中创建唯一实例对象(因为构造函数私有化了,所以单例类的唯一实例对象只能在单例类里面创建;),使用一个私有静态的成员变量保存

3、对外提供一个公开的静态的函数供别人获取这个唯一实例对象

#单例的两种实现方法:

1)饿汉式

特点:在加载类的同时就创建了这个类的唯一实例;

好处:可保证这个类的实例的唯一性;

弊端:如果只是使用这个类,但是暂时不需要它的对象,也会创建唯一实例,造成内存的浪费;

代码模板:

2)懒汉式:

特点:在第一次调用获取实例的方法时才创建对象;

好处:第一次调用获取实例的方法时才创建对象,可以避免内存的浪费;

弊端:多线程环境下不能保证实例的唯一性;

代码模板:

上面两种是从人家博客里面截图的,比较清晰的说明了饿汉模式和懒汉模式的区别

#单例模式的优点

1)严格控制对唯一的实例的访问方式(可以允许有限数量的实例)

2)仅有一个实例,可以节约系统资源

#单例模式的缺点

1)单例模式没有抽象层,扩展比较困难

2)职责过重,即充当工厂角色,有充当产品角色。

3)如果长期不使用,Java会自动回收,导致下次使用又重新实例化。

#单例模式的特点

1)有且仅有一个单例类实例(无法通过反序列化重新构建对象)

2)构造函数私有化

3)通过静态方法或枚举获得单例类实例

#python实现单例模式

#(1)
class Test:
def __new__(cls):
if not hasattr(cls,'instance'):
cls.instance=super(Test,cls).__new__(cls)
return cls.instance obj1=Test()
obj2=Test()
print(obj1 is obj2) #(2) def singleton(cls):
instances={}
def getinstance(*args,**kwargs):
if cls not in instances:
instances[cls]=cls(*args,**kwargs)
return instances[cls]
return getinstance @singleton
class MyClass:
a=1 c1=MyClass()
c2=MyClass()
print(c1==c2)

还有其他的,我也不想再写了

什么是单例?为什么要用单例?

一个类被设计出来,就代表它表示具有某种行为(方法),属性(成员变量),而一般情况下,当我们想使用这个类时,会使用new关键字,这时候jvm会帮我们构造一个该类的实例。而我们知道,对于new这个关键字以及该实例,相对而言是比较耗费资源的。所以如果我们能够想办法在jvm启动时就new好,或者在某一次实例new好以后,以后不再需要这样的动作,就能够节省很多资源了。

作者:jsbintask22
链接:http://www.imooc.com/article/279430
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作

什么是单例?为什么要用单例?

一个类被设计出来,就代表它表示具有某种行为(方法),属性(成员变量),而一般情况下,当我们想使用这个类时,会使用new关键字,这时候jvm会帮我们构造一个该类的实例。而我们知道,对于new这个关键字以及该实例,相对而言是比较耗费资源的。所以如果我们能够想办法在jvm启动时就new好,或者在某一次实例new好以后,以后不再需要这样的动作,就能够节省很多资源了。

作者:jsbintask22
链接:http://www.imooc.com/article/279430
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作

#参考

http://www.imooc.com/article/279430

https://baijiahao.baidu.com/s?id=1619543284145447185&wfr=spider&for=pc

http://www.sohu.com/a/141927148_812245

python 设计模式之单例模式 Singleton Pattern的更多相关文章

  1. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  2. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  3. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  4. 二十四种设计模式:单例模式(Singleton Pattern)

    单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...

  5. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)【转】

    介绍 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例 保证一个类仅有一个实例. Singleton using System; using System.Collections.Gene ...

  6. Java 设计模式(三)-单例模式(Singleton Pattern)

    1     概念定义 1.1   定义 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 1.2   类型 创建类模式 1.3   难点 1)多个虚拟机 当系统中的单例类被拷贝运行在多 ...

  7. 【UE4 设计模式】单例模式 Singleton Pattern

    概述 描述 保证一个类只有一个实例 提供一个访问该实例的全局节点,可以视为一个全局变量 仅在首次请求单例对象时对其进行初始化. 套路 将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符. ...

  8. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  9. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

随机推荐

  1. 反射,内置方法,__str__ __repr__

    反射 反射用到的mmp模块 def wahaha():print('wahaha') class QQxing: def __init__(self,name): self.name = name d ...

  2. Type mismatch: cannot convert from element type Object to String 解决办法

    首先放上我的源码,看看你的代码是不是我这个类似的. @Test void predicateTest() throws Exception { List<String> languages ...

  3. 帝国CMS熊掌号数据主动推送插件【原创】

    因为昨晚一个朋友他是帝国CMS做的网站,叫我给他做个熊掌号改造和熊掌号推送,所以花了一个小时时间做了这个插件,有需要的朋友可以拿去. 第一步:在后台执行以下数据库语句: CREATE TABLE `b ...

  4. K-means: 多次random initialization来避免bad局部最优

    K-means algorithm initialize K-means算法中有一步为随机初始化cluster centroids,这步如何进行,我们将介绍一种运行比较好的方法,这种方法比其它初始化的 ...

  5. 关于docker的UnionFS系统原理

    docker镜像的结构就像花卷一样,是一层一层的,比如tomcat镜像,它有450M左右,但我们实际的tomcat却很小,为什么tomcat镜像那么大呢,是因为,tomcat镜像的最里面是kernel ...

  6. Java switch语句使用注意事项

    1.多个case后面的值不可以重复 2.switch后面小括号的数据类型(case 后面的数值类型)只能是以下类型 基本数据类型: byte / short / char / int 引用数据类型:S ...

  7. JAVA读取XML并打印

    在G盘下新建XML文档:person.xml,XML代码: <?xml version="1.0" encoding="utf-8"?> <s ...

  8. Python3学习(一)

    基本语法 python3不向下兼容,有些语法跟python2.x不一样,IDLE shell编辑器,快捷键:ALT+p,上一个历史输入内容,ALT+n 下一个历史输入内容.#idle中按F5可以运行代 ...

  9. Oracle NVL 函数 nvl nvl2

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  10. Base64原理解析与使用

    一.Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送.这样用途就受到了很大的 ...