单例模式

单例模式详解(图文并茂,简单易懂)

岁酱吖の 提交于 2019-11-29 23:37:40
一、java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、恶汉式单例。 单例模式有以下特点: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 目的:单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个打印服务,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。 二、懒汉式单例 public class SingletonTest { public static SingletonTest singleton = null; public static SingletonTest getInstance(){ if(singleton == null){ singleton = new SingletonTest(); System.out.println("创建一次"); } return singleton; } public void show(){

设计模式-单例模式学习笔记

╄→гoц情女王★ 提交于 2019-11-29 22:34:01
设计模式-单例 太长不看版 DCL、Holder(静态内部类)和饿汉式单例都可以通过反射或者序列化破坏。 直接用枚举单例就完事了。 为什么要用单例模式 场景:多线程情况下操作相同对象应该是同一个对象。例如文件。 解决办法 在实例化过程中,所有的对象只实例化一次。 需要实现一个实例化的过程并且向用户提供一个返回实例对象的方法。 分析角度 线程安全性。 性能。 懒加载。 单例模式的分类 饿汉式 在加载时就产生实例化对象存放在堆中,后续使用时只会取到同一个实例化对象,故判断其线程安全。(Ref:JVM ClassLoader)。 不存在延迟加载的情况,长时间不使用仍然会保存在堆内存中,若单例数据较大的时候会产生内存浪费,甚至可能会产生内存溢出影响性能。 因此比较适合少量数据的单例模式。 public class HungrySingleton { private byte[] data=new byte[1024]; private static HungrySingleton instatance=new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getInstance(){ return instatance; } } 懒汉式

Python面试

霸气de小男生 提交于 2019-11-29 22:17:01
目录 1.args和 kwargs 是什么意思? 2.python里面如何拷贝一个对象? 3.简要描述python的垃圾回收机制 4.什么是lambda函数?它有什么好处? 5.python如何实现单例模式? 6.python自省 7.谈一谈python的装饰器 8.什么是鸭子类型? 9.@classmethod和@staticmethod 10.谈一谈python中的元类 1.args和 kwargs 是什么意思? 答:args表示可变参数(variadic arguments),它允许你传入0个或任意个无名参数,这些参数在函数调用时自动组装为一个tuple; **kwargs表示关键字参数(keyword arguments),它允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。同时使用*args和**kwargs的时候,必须保证*args在**kwargs之前。 扩展阅读: https://blog.csdn.net/mbugatti/article/details/53884455 2.python里面如何拷贝一个对象? 答: (1) 赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个; (2)浅拷贝(copy.copy()),创建一个新的对象,但它包含的是对原始对象中包含项的引用

java 单例模式

僤鯓⒐⒋嵵緔 提交于 2019-11-29 21:50:48
单例模式:保证一个类,只能存在一个实例 1. 懒汉式:第一次调用时候,才创建实例 --------线程不安全 2. 饿汉式:在类第一次加载完成之后,就创建实例 ------线程不安全 实例步骤: 私有的构造器 私有的 静态的 该类的引用 公共的静态的访问方式 懒汉式:保证线程安全通过 同步锁 synchronized 饿汉式:第一次加载,就创建对象 来源: https://blog.csdn.net/GY_BO/article/details/100935354

单例模式(二)

北慕城南 提交于 2019-11-29 21:24:17
前言 单例模式在平时算比较常见,有关java单例模式的写法有很多种,在这里分析一种比较好的写法。 代码 public class Test { private volatile static Test instance; private Test() { } public static Test getInstance() { if (instance == null) { synchronized (Test.class) { if (instance == null) { instance = new Test(); } } } return instance; } } 代码解释: 第一个注意点:使用私有的构造函数,确保正常情况下该类不能被外部初始化(非正常情况比如通过反射初始化,一般使用反射之后单例模式也就失去效果了)。 第二个注意点:getInstance方法中第一个判空条件,逻辑上是可以去除的,去除之后并不影响单例的正确性,但是去除之后效率低。因为去掉之后,不管instance是否已经初始化,都会进行synchronized操作,而synchronized是一个重操作消耗性能。加上之后,如果已经初始化直接返回结果,不会进行synchronized操作。 第三个注意点:加上synchronized是为了防止多个线程同时调用getInstance方法时

static、final和单例模式

十年热恋 提交于 2019-11-29 21:23:52
static 那天我朋友问了我个问题,static和单例模式有什么区别,所以我觉得static可以讲一下 他的问题是,把对象弄成static是不是就不变了 显然,这是还没弄清楚引用和对象的区别 其实存放在静态区中的是引用,而不是对象。而对象是存放在堆中的。如果有这样一句话 public static final Book book = new Book(); 意思就是book这个引用,指向了这个new出来的对象。 static的引用和正常的引用有什么区别? 当你加载了这个类的时候(第一次使用这个类的时候会加载这个类到jvm),这个static引用会率先被加载。所以,当我们第一次调用Book.book的时候,这个静态的book引用就会一直存放在静态区里了(当fullGC回收整个类才会销毁这个引用)。 而正常的引用,只能通过new出一个对象后才能使用,所以当对象被回收了,这个引用自然也回收了(而且非静态引用如果是方法中的引用,会存放在函数的栈里;如果是对象的引用,会和对象一起存放在heap里)。 final final定义了之后,你就必须在一开始就需要赋值,所以上面那行代码就必须在一开始就赋值。而如果你想延迟加载,提高性能,那么就不可以用final。 单例模式 单例模式是如果实现的,就是通过调用这个类里的一个静态方法,弄一个if语句判断一下,如果有实例了,就返回这个实例,如果没有

python的单例模式和__new__方法

喜欢而已 提交于 2019-11-29 19:52:44
#### 单例模式是一个常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。比如说:利用加标签的白名单防止跨站脚本攻击XXS创建一个XxsFile类,不同的人访问都要创建XxsFile对象的实例,这就导致系统中存在多个XxsFile的实例对象,而这样会严重浪费内存资源。事实上类似于XxsFile这样的类,我们希望在程序运行期间只存在一个实例对象,在python中,我们可以使用单例。如下列几种方法: 1、类方法classmethod # -*-coding:utf-8 -*- class Foo(object): __instance = None @classmethod def instance(self): if self.__instance: return self.__instance else: obj = self() self.__instance = obj return self.__instance obj1=Foo.instance() obj2=Foo.instance() print(obj1,obj2) 2、基于__new__方法实现(推荐使用、方便) 当我们实例化一个对象时,是先执行了类的__new__方法(当我们没写时,默认调用object.__new__),实例化对象;然后再执行类的__init__方法,对这个对象进行初始化

单例模式

断了今生、忘了曾经 提交于 2019-11-29 19:52:35
转自: https://www.cnblogs.com/xiaoxi/p/7799456.html 单例模式作为一种目标明确、结构简单、理解容易的设计模式,在软件开发中使用频率相当高,在很多应用软件和框架中都得以广泛应用。 1.主要优点 单例模式的主要优点如下: 单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。 允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例,既节省系统资源,又解决了单例单例对象共享过多有损性能的问题。 2.主要缺点 单例模式的主要缺点如下: 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。 单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。 现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致共享的单例对象状态的丢失。 3.适用场景

单例模式

人走茶凉 提交于 2019-11-29 19:47:18
单例模式: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 应用场景: 比如 MP3 切歌页面 ,不能换首歌就换个页面 < || > 所以我们这里用到了单例模式 再比如 一个班级只有一个班主任 不能上一节课换一个班主任 饿汉式: package com.hainiu.designMode; public class EagerSingleton { // 饿汉式 private static EagerSingleton es = new EagerSingleton(); //创建对象 private EagerSingleton(){ } //对外提供公共的访问方式 public static EagerSingleton getEagerSingleton(){ return es; } // public static void main(String[] args) { EagerSingleton dd = EagerSingleton.getEagerSingleton(); EagerSingleton d = EagerSingleton.getEagerSingleton(); System.out.println(dd); System.out.println(d); } }

设计模式之单例模式

自作多情 提交于 2019-11-29 19:31:57
一,前言 ​ 单例模式在23中设计模式中是最为基础的一种,并且使用范围非常广泛,属于设计模式中的创建型模式。 ​ 什么是单例: 指某一个类只允许存在一个实例对象。 ​ 单例模式特点: 单例只允许一个实例存在,减少资源浪费。 对于频繁创建和销毁的对象,单例模式可以很好的解决,提高系统的性能。 单例类只能自己提供自己的实例对象,因为单例模式构造方法是私有的。 对外提供唯一的全局访问方式。 ​ 单例模式的实现:懒汉式,饿汉式。 二,饿汉式 ​ 饿汉式单例模式,字面理解就是很饿很急的感觉。因此这种单例对象就是即时创建,类初始化完成时该对象就已经创建完成。使用起来很方便,但是很容易产生较多的 垃圾对象 ,同时浪费内存空间,下面请看示例代码: public class Singleton { private static Singleton singleton = new Singleton(); // 私有化无参构造 private Singleton(){} // 对外提供访问对象的接口 public static Singleton getSingleton(){ return singleton; } } ​ 饿汉式是线程安全的,在类加载时就已经创建完成。 三,懒汉式 ​ 懒汉式的创建方式与饿汉式相反,即什么时候用到就什么时候创建,典型的 懒加载 机制。因此在多线程情况下是线程不安全的