单例模式

设计模式之单例模式

荒凉一梦 提交于 2019-12-30 05:10:54
核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。 常见应用场景: 项目中读取配置文件的类,一般也只有一个对象。没必要每次使用配置文件的时候,都new一个对象去读取; 数据库连接池的设计一般是单利模式,因为数据库的连接是很耗资源的; 在servlet中的Application也是单利模式; 在Spring中,每个Bean都是单利的,这样的优点就是Spring容器可以去管理; 在Servet编程中,每个servlet也是单例的; springMVC中的控制器也是单例的; 单例模式的优点:   - 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象产生需要消耗较多资源时,如读取配置文件、产生其他依赖对象时,则可以通过在启动时直接创建出一个对象,然后永久驻留内存的方式来解决   - 单例模式可以在系统设置全局的访问点,优化环共享资源的访问 常见的四种单例模式的实现方式:   -饿汉式(线程安全,调用效率高,不能延时加载)   -懒汉式(线程安全,调用效率不高,可延时加载)   -静态内部类式(线程安全,调用效率高,可延时加载)   -枚举单例(线程安全,调用效率高,不能延时加载,并且可以避免通过反射和序列化创建新对象) 选用方式:    单例对象占用资源少,不需要延时加载     枚举式 好于 饿汉式;   单例对象占用资源大,需要延时加载    

① 设计模式的艺术-01.单例(Singleton)模式

…衆ロ難τιáo~ 提交于 2019-12-30 05:05:49
单例模式为何要出现   在工作过程中,发现所有可以使用单例模式的类都有一个共性,那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的。   如果我们不将这个类控制成单例的结构,应用中就会存在很多一模一样的类实例,这会非常浪费系统的内存资源,而且容易导致错误甚至一定会产生错误, 所以我们单例模式所期待的目标或者说使用它的目的,是为了尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可以正常运作。 常见应用场景   Windows的Task Manager(任务管理器)就是很典型的单例模式   windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。   项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。   网站的计数器,一般也是采用单例模式实现,否则难以同步。   应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。   数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。   操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。   Application 也是单例的典型应用(Servlet编程中会涉及到)

设计模式(一) 单例模式

扶醉桌前 提交于 2019-12-30 04:59:30
核心作用:    保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 常见应用场景: 单例模式的优点: 由于单例模式只生成一个实例,减少了系统的开销,当一个对象的产生需要比较多的资源师,如:读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后 永久驻留内存的方式 来解决 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类负责所有数据表的映射处理 常见的五种单例模式实现方式: 饿汉式(线程安全,调用效率高,不能延时加载)     解释:饿汉式单例代码中,static变量会在类装载是初始化,此时也不会涉及多个线程对象访问该对象的问题。虚拟保证只会装载一次该类,肯定不会发生并发访问的问题。因此不需要synchronized关键字     问题:如果只是加载本类,而不是要调用getInstance(),甚至永远没有调用,则会造成资源浪费    package com.lp.singleton; /*测试饿汉式单例模式*/ /*当类实例化的*/ public class SingletonDemo1 { // ctrl + m 快捷键 优化界面 // 重点:类初始化时立即加载 private static SingletonDemo1 instance = new SingletonDemo1(); /

单例设计模式和main方法

让人想犯罪 __ 提交于 2019-12-29 23:15:54
设计模式就是在大量的实践中总结和理论之后优选的代码结构、编程风格、以及解决问题的思考方式。 说白了设计模式就是在实际编程中逐渐总结出的解决问题的套路,类似于数学公式。 类的单例设计模式:在开发过程中有且只有一个实例化对象。 怎么做到在整个系统运行过程中,这个类只被实例化一次?不论在哪只调用这一个实例?    什么情况下使用单例设计模式?   实例化对象的创建要消耗大量的时间和资源,例如构造方法中的代码行太多。或者频繁的new的新对象没有必要。    //饿汉式:一开始就new一个对象出来public class Singleton { //私有构造方法,调用这个类的人就不能直接使用new来创建对象 private Singleton(){ } //私有的Singleton类型的类变量 private static Singleton INSTANCE = new Singleton(); //构建返回返回类变量的方法 public static Singleton getInstance(){ return INSTANCE; } }    //懒汉式:最开始,对象是null,直到有第一个人调用才new一个对象,之后所有的调用都用这个对象 public class Singleton { //先私有化构造方法,不能让外边直接new对象 private Singleton() { }

【python基础】单例模式 & 工厂模式 & 策略模式 & 观察者模式

心不动则不痛 提交于 2019-12-29 22:13:03
一、单例模式   单例:单个实例,确保某个类只有一个实例存在   举例:1、登录app,当前的登录对象,只能有一个      2、音乐播放器,正在播放的歌曲类而言,只能有一个实例 1 import my_util # 被导入的模块会从头到尾执行一遍 2 3 o1 = my_util.a 4 o2 = my_util.a 5 o3 = my_util.a 6 7 print(o1) 8 print(o2) 9 print(o3) 10 11 12 class Person: 13 __obj = None # 单例 14 15 def __new__(cls, *args, **kwargs): # 创建实例对象 ---> 实例 16 17 if not cls.__obj: 18 cls.__obj = super().__new__(cls) 19 return cls.__obj 20 21 def __init__(self): # 自己,本身; 谁调用谁就是self; 实际上,在调用init时, 实例对象已经被创建出来了; 22 pass 23 24 25 p1 = Person() # 1. 调用new方法,创建实例对象, 开辟内存空间, 存储对象 2. 自动调用init方法 26 p2 = Person() 27 28 print(p1) # <__main__

设计模式(一)单例模式(Singleton Pattern)

点点圈 提交于 2019-12-27 10:45:09
一、引言 最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法罢了(设计模式其实就是帮助我们解决实际开发过程中的方法, 该方法是为了降低对象之间的耦合度,然而解决方法有很多种,所以前人就总结了一些常用的解决方法为书籍,从而把这本书就称为设计模式),下面给出单例模式的一个官方定义: 确保一个类只有一个实例,并提供一个全局访问点。 为了帮助大家更好地理解单例模式,大家可以结合下面的类图来进行理解,以及后面也会剖析单例模式的实现思路: 三、为什么会有单例模式 看完单例模式的介绍,自然大家都会有这样一个疑问——为什么要有单例模式的?它在什么情况下使用的?从单例模式的定义中我们可以看出——单例模式的使用自然是当我们的系统中某个对象只需要一个实例的情况,例如:操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等

Java单例模式探究

我们两清 提交于 2019-12-27 08:27:56
作为对象的创建模式 [GOF95] , 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。由定义可以总结出单例模式的要点有三个:一是单例类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个 Printer Spooler ,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。 虽然从类图上看,单例模式是最简单的设计模式之一,但是真正正确地使用单例模式却不是那么简单的事。 首先看一个经典的单例实现。 public class Singleton { private static Singleton uniqueInstance = null ; private Singleton() { // Exists only to defeat instantiation. } public static Singleton getInstance() { if ( uniqueInstance ==

单例模式

。_饼干妹妹 提交于 2019-12-27 02:21:23
一、概述 单例模式的 定义 就是 确保某一个类只有一个实例,并且提供一个全局访问点。 属于设计模式三大类中的 创建型模式 。 单例模式具有典型的三个 特点 : 只有一个实例。 自我实例化。 提供全局访问点。 二、优缺点 优点 :由于单例模式只生成了一个实例,所以能够节约系统资源,减少性能开销,提高系统效率,同时也能够严格控制客户对它的访问。 缺点 :也正是因为系统中只有一个实例,这样就导致了单例类的职责过重,违背了“单一职责原则”,同时也没有抽象类,这样扩展起来有一定的困难。 三、常见实现方式 常见的单例模式实现方式有五种: 饿汉式 、 懒汉式 、 双重检测锁式 、 静态内部类式 和 枚举单例 。而在这五种方式中 饿汉式 和 懒汉式 又最为常见。下面将一一列举这五种方式的实现方法: 饿汉式 : 线程安全 ,调用效率高。但是不能延时加载。示例: public class SingletonDemo1 { <span class="token comment">//线程安全的</span> <span class="token comment">//类初始化时,立即加载这个对象</span> <span class="token keyword">private</span> <span class="token keyword">static</span> <span class=

单例模式看着一篇就够了,破解谣言版!!!

放肆的年华 提交于 2019-12-26 22:36:26
大家好,今天给大家介绍一下单例模式。本文是从实际应用开发,结合网络上多篇技术博客,总结其精华、完善其缺陷和优化案例说明角度向大家展示什么叫做单例模式,如何创建单例及其优缺点和什么时候用单例。原创不易,点赞关注支持一下! 什么叫单例模式? 单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。 看起来很晦涩,白话一点说就是要具备某各类 只能有一个实例 、它必须自行创建这个实例和必须自行向整个系统提供这个实例。 如何创建实例? 单例的创建大致分为懒汉模式、饿汉模式、静态内部类、双重加锁等等。我们着重介绍和推荐使用的是双检锁模式,其他模式请自行百度 :-),话不多说直接上代码。 public class SingletonEntity { private volatile static SingletonEntity singtonEntity = null; private SingletonEntity(){ } public void test(String context){ System.out.println(context); } public static SingletonEntity getInstance(){ if (singtonEntity == null){ synchronized (SingletonEntity

C#静态类+泛型实现单例模式

那年仲夏 提交于 2019-12-26 16:32:22
/// <summary> /// 管理单实例 /// </summary> /// <typeparam name="T">Type of the singleton class.</typeparam> public static class Singleton < T > where T : class { # region Fields /// <summary> /// 目标类 /// </summary> static volatile T _instance ; /// <summary> /// The dummy object used for locking. /// </summary> static object _lock = new object ( ) ; # endregion Fields # region Constructors /// <summary> /// 构造函数 /// </summary> static Singleton ( ) { } # endregion Constructors # region Properties /// <summary> /// 获取T实例 /// </summary> public static T Instance { get { if ( _instance == null ) lock (