单例模式

浅谈singleton单例模式

蹲街弑〆低调 提交于 2020-01-28 04:45:37
一、前言 单例模式比较简单,可以说没有复杂的调用和接口的设计,就是一个简单的类,只是要求这个类只生成一个对象,无论什么时候都要保证这一点,因此只能生成一个实例的模式就是单例模式。 二、类的加载 类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式加载类,也可以是懒汉式加载,这跟不同的JVM实现有关。加载完类后,类的初始化就会发生,如果是对一个类的主动使用就会初始化对象,对类的被动使用不会对类进行初始化,比如final修饰的静态变量如果能在编译时就确定变量的取值,会被当做常量,作为对一个类的被动使用不会导致类的初始化。以下情况类被初始化: 类初始化的一些规则: 类从顶到底的顺序初始化,所以声明在顶部的字段遭遇底部的字段初始化; 超类早于子类和衍生类的初始化; 如果类的初始化是由于访问静态域而触发,那么只能声明静态域的类才被初始化,而不会触发超类的初始化或者子类的初始化,即使静态域被子类或子接口或者它的实现类锁引用; 接口初始化不会导致父接口的初始化; 静态域的初始化时在类的静态初始化期间,非静态域的初始化是在类的实例创建期间,这意味着静态域初始化在非静态域之前; 非静态域通过构造器初始化,子类在做任何初始化之前构造器会先调用父类的构造器,它保证了父类非静态或实例变量初始化早于子类; 三、单例模式的特点 单例模式有以下特点: 单例类只能有一个实例。

设计模式--单例模式

ぃ、小莉子 提交于 2020-01-28 04:09:14
文章目录 基本概念 1. 懒汉式 2. 懒汉式改进--类锁 写法一: 写法二: 3. double check 4. 静态内部类 5. 饿汉式 6. Enum枚举类单例模式 7. 单例模式的破坏:反序列化之后的实例和原来的实例相同吗 8. 单例模式反射攻击 原理:可以通过反射调用构造器** 解决办法 9. 容器单例 10. ThreadLocal线程单例模式 11. 单例模式的一些应用 基本概念 定义 保证一个类仅有一个实例,并提供一个全局的访问点 类型 创建型 适用场景 确保任何情况下都绝对只有一个实例 比如: 单服务情况下的计数器可以用单例,但是集群就需要用共享 线程池、连接池 配置 优点 内存中只有一个实例,减少了内存开销 避免对资源的多重占用(比如说文件需要避免重复打开导致同时写) 设置全局的访问点,严格控制访问 缺点 没有接口,扩展困难,如果要修改,肯定要修改代码 需要注意的事情 私有化构造器 线程安全(非常重要) 延迟加载(非常重要) 序列化和反序列化安全的问题 反射(防止反射攻击) 相关的设计模式 单例模式和工厂模式 单例模式和享元模式 1. 懒汉式 /** * @Classname LazySingleton * @Description 线程不安全的懒汉式 * @Date 2019/12/22 15:58 * @Author Cheng */ public

php单例模式

眉间皱痕 提交于 2020-01-27 17:00:48
php单例模式 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。 要点主要有三个: 1.一个类只能有一个对象; 2.必须是自行创建这个类的对象; 3,要想整个系统提供这一个对象; 从具体实现角度来说,就是以下三点: 一是单例模式的类只提供私有的构造函数, 二是类定义中含有一个该类的静态私有对象, 三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。 当然还要有一个private的clone方法,防止克隆; 优点 一、实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点 一、开销 虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。 二、可能的开发混淆 使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。 三、对象生存期 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配

单例模式

南笙酒味 提交于 2020-01-27 04:52:14
单例模式 是一种比较常见的设计模式,但是在Java中要用好单例模式,并不是一件简单的事。在整个系统中,单例类只能有一个实例对象,且需要自行完成示例,并始终对外提供同一实例对象。 因为单例模式只允许创建一个单例类的实例对象,避免了频繁地创建对象,所以可以减少GC的次数,也比较节省内存资源,加快对象访问速度。例如,数据库连接池、应用配置等一般都是单例的。 单例模式有很多种写法,但是有些写法在特定的场景下,尤其是多线程条件下,无法满足实现单一实例对象的要求, 从而导致错误。首先我们来介绍比较经典的懒汉模式和饿汉模式,具体实现如下: //饿汉模式 public class Singleton { //饿汉模式是最简单的实现方式,在类加载的时候就创建了单例类的对象 private static final Singleton instance = new Singleton ( ) ; //单例类的构造方法都是私有的,防止外部创建单例类的对象 private Singleton ( ) ; public static Singleton newInstance ( ) { return instance ; //返回唯一的到单例对象 } } //懒汉模式 public class Singleton { private static Singleton instance = null ;

设计模式(一)单例模式

微笑、不失礼 提交于 2020-01-27 03:53:41
单例模式实现方式以及类加载 跳转到原文 本文主要介绍java的单例模式,以及详细剖析静态内部类之所以能够实现单例的原理。OK,废话不多说,进入正文。 首先我们要先了解下单例的四大原则: 1.构造私有。 2.以静态方法或者枚举返回实例。 3.确保实例只有一个,尤其是多线程环境。 4.确保反序列换时不会重新构建对象。 我们常用的单例模式有: 饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式,我们来逐一分析下这些模式的区别。 1.饿汉模式: public class SingleTon{ private static SingleTon INSTANCE = new SingleTon(); private SingleTon(){} public static SingleTon getInstance(){ return INSTANCE; }} 饿汉模式在类被初始化时就已经在内存中创建了对象,以空间换时间,故不存在线程安全问题。 2.懒汉模式: public class SingleTon{ private static SingleTon INSTANCE = null; private SingleTon(){} public static SingleTon getInstance() { if(INSTANCE == null){ INSTANCE = new

面向对象--实现单例模式

主宰稳场 提交于 2020-01-27 02:04:44
1.定义 一个类只能创建一个对象 为什么使用单例模式: 对于系统中的某些类来说,只有一个实例重要,比如:Windows中只能打开一个任务管理器。如果不使用单例模式,将会弹出多个任务管理器窗口,若显示的内容完全一致,则显示对象重复,浪费内存资源;若显示的内容不一致,则表示在这一瞬间系统有多个状态,与实际不符,也会给用户带来误解。因此确保系统中某个对象的唯一性很重要。 2.实现单例模式的三种方式 (1)装饰器实现单例模式 #装饰器实现单例模式 from functools import wraps def singleton ( cls ) : instances = { } #key是类名,value是对象名 @wraps ( cls ) def wrapper ( * args , ** kwargs ) : name = cls . __name__ #获取类的名字 if instances . get ( name ) : return instances . get ( name ) #直接返回缓存中的对象 else : obj = cls ( * args , ** kwargs ) instances [ name ] = obj return obj return wrapper @singleton class Person ( object ) : pass if

c++设计模式-单例模式

送分小仙女□ 提交于 2020-01-26 23:45:25
定义 只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例 具体运用场景 1.设备管理器,系统中可能有多个设备,但是只有一个设备管理器,用于管理设备驱动; 2.数据池,用来缓存数据的数据结构,需要在一处写,多处读取或者多处写,多处读取; 要点 1.全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private) 2.禁止赋值和拷贝 3.用户通过接口获取实例:使用 static 类成员函数 4.线程安全 实现 示例一、没有考虑线程安全的方式 class Singleton{ private: Singleton(){ //...... } Singleton(Singleton&); Singleton& operator=(const Singleton&); static Singleton* instance_ptr; public: ~Singleton(){ //..... } static Singleton* get_instance(){ if(instance_ptr==nullptr){ instance_ptr = new Singleton; } return instance_ptr; } }; Singleton* Singleton::instance_ptr = nullptr;

单例模式,简单工厂模式

北慕城南 提交于 2020-01-26 05:05:51
单例模式的目的:保证一个类仅有一个实例,并提供一个访问实例的全局访问点。 要点:1、单例类拥有一个私有构造函数,确保用户无法通过new 关键字去直接实例化它。 2、单例模式包含一个静态私有成员变量与静态公用工厂方法。 设计代码: public class Singleton{ private static Singleton instance=null; private Singleton(){ } public static Singleton getInstance(){ if(instance==null){ instance = new Singleton(); } return instance; } } 简单工厂模式 模式分析: 1.将对象的创建和对象本身的业务处理分离,可以降低系统的耦合度,使得两者修改起来都相对容易。 2.在调用工厂类的工厂方法是,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数是无须修改任何的java源代码。 3.简单工厂模式最大的问题是工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相对违背的。 4.简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象

面向对象—04实现单例模式

别说谁变了你拦得住时间么 提交于 2020-01-26 00:57:24
单例模式 1、定义 一个类只能创建一个对象 为什么要使用单例模式: 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务, 但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有 一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制 对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象, 浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际 不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯 一性即一个类只能有一个实例非常重要 2、实现单例模式的三种方法 (1)装饰器实现单例模式 (2)__ new __魔术方法实现 (3)metaclass自定义元类实现 """ (1)装饰器实现单例模式 """ from functools import wraps # 用装饰器来装饰类 def singleton ( cls ) : instances = { } # {Person : obj} key值是类名 , value值是对象名 @wraps ( cls ) def wrapper ( * args , ** kwargs ) : if instances . get ( cls . _

单例模式——《设计模式》

橙三吉。 提交于 2020-01-25 04:01:31
概念 什么是单例模式? 首先,单例模式,属于 创建型 设计模式。 许多时候系统只需要拥有一个全局类,这样为了协调系统整体的行为。也就是说单例对象的类只能允许一个实例存在。 单例模式的优缺点 优点 在内存中只有一个对象,节省内存空间; 避免频繁的创建销毁对象,可以提高性能; 避免对共享资源的多重占用,简化访问; 为整个系统提供一个全局访问点。 缺点 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出; 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失; 单例模式的实现 这里主要介绍两种:饿汉式单例、懒汉式单例 一、饿汉式单例 //饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { private Singleton1 ( ) { } private static final Singleton1 single = new Singleton1 ( ) ; //静态工厂方法 public static Singleton1 getInstance ( ) { return single ; } } 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是 线程安全 的。 二、懒汉式单例 /