单例模式

【设计模式】单例模式

喜夏-厌秋 提交于 2020-01-30 19:32:39
单例模式 单例模式: 保证一个类仅有一个实例,并提供一个全局访问点。 将构造函数放到private里,并提供全局访问点(static静态函数,返回类内部唯一构造实例) 为什么用静态函数,静态成员变量? 调用类里的函数需要先构造对象,有对象才能调用类内成员方法。但这个方法肯定不适合单例模式。 而另一种方法就是静态函数,可以使用类名直接调用。而静态函数只能调用静态成员方法。 上述代码属于 懒汉模式 :在第一次用到类实例的时候才会去实例化,访问量较小时, 采用懒汉式,以时间换空间。 分析: 最内层的判断,保证单线程肯定智能创建一个对象。 外面的锁,保证创建的过程是原子操作。 在外面的判断,保证只有第一次回加锁,后面就会重复加锁,再判断。 还有一个 饿汉式: 在单例类定义的时候就进行实例化。访问量较大、线程较多时, 采用饿汉式,以空间换时间。 线程安全,因为一开始就实例化了。 来源: https://www.cnblogs.com/LampsAsarum/p/12243514.html

Java-----关于单例设计模式

末鹿安然 提交于 2020-01-30 18:50:23
1. 单例模式DCL写法 单例设计模式中,有一种双重检查锁的写法, 也就是所谓的懒汉式 class Single{   private static Single sSingle;   private Single() {}   public static Single getInstance() {     if(sSingle == null) {       synchronized(Single.class) {         if(sSingle == null) {           sSingle = new Single();         }       }     }     return sSingle;   } } 2.DCL写法的问题 这种写法,如果使用sonar代码检测工具,会有警告提示,具体描述如下 Double-checked locking is the practice of checking a lazy-initialized object's state both before and after a synchronized block is entered to determine whether or not to initialize the object. It does not work reliably in a

Java设计模式-单例模式的7种写法详解(上)

余生颓废 提交于 2020-01-30 10:11:31
Java设计模式-单例模式的7种写法详解(上) 参照B站尚硅谷官方视频资源:https://www.bilibili.com/video/av57936239?p=33 文章目录 Java设计模式-单例模式的7种写法详解(上) 0.前言 1.饿汉式(静态常量)实现单例模式 1.1 实现步骤 1.2 具体编码 1.3 测试验证 1.4 阶段小结 2.饿汉式(静态代码块)实现单例模式 2.1 实现步骤 2.2 具体编码 2.3 测试验证 2.4 阶段小结 3.懒汉式(线程不安全)实现单例模式 3.1实现步骤 3.2具体编码 3.3测试验证 3.4阶段小结 4.懒汉式(线程安全,同步方法)实现单例模式 4.1实现步骤 4.2具体编码 4.3测试验证 4.4阶段小结 5.一种错误的写法:懒汉式(同步代码块) 5.1实现步骤 5.2具体编码 5.3测试验证 5.4阶段小结 0.前言 单例模式: 确保此类只有一个实例,并提供获取实例的方法。 作用: 可以保持在一个应用程序生命周期内,所引用对象的实例均为同一个 使用场景:例如工具类,使用了单例模式后,可避免重复创建实例造成的资源浪费。 单例模式分为以下7种: 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 双重检查 静态内部类 枚举 也可说是5种,只是懒汉饿汉各自又有2种不同的实现方式。

python学习36:单例设计模式

那年仲夏 提交于 2020-01-29 22:51:45
设计模式: 设计模式是前人工作的总结和提炼。通常被人们广泛流传的设计模式都是针对某一特定问题的成熟解决方案。 使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性。 单例设计模式: 目的:让类创建对象,在系统中只有唯一的一个实例(对象) 每一次执行类名()返回的对象内存地址是相同的 怎么保证这些对象只有一个? __new__方法:   我们用类名创建对象的时候,python解释器会帮我们做两件事情: 为对象分配空间 对象初始化   使用类名()创建对象时,,python解释器首先会调用__new__方法为对象分配空间。   __new__方法是一个由object基类提供的内置的静态方法,主要有两个作用:在内存中为对象分配空间;返回对象的引用。   python解释器获得对象的引用后,将引用作为第一个参数,传递给__init__方法(__new__负责给对象分配空间,__init__负责给对象初始化)。   重写__new__方法:继承自父类的方法;返回父类方法调用__new__方法的结果。重写__new__方法一定要return object. new (cls),否则python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法。 class MusicPlayer ( object ) : instance = None def __new__ (

单例模式

谁说我不能喝 提交于 2020-01-29 16:23:32
设计模式大家都很熟悉,今天来记录下最基础也最简单的单例模式 单例模式分为两类,一是饿汉式,另外就是相对的懒汉式 想来看看饿汉式 常见的实现方式如下: 1 public class SingletonHungry { 2 private static SingletonHungry instance = new SingletonHungry(); 3 4 private String token; 5 6 private SingletonHungry() { 7 token = System.currentTimeMillis() + ""; 8 } 9 10 public static SingletonHungry getInstance() { 11 return instance; 12 } 13 14 public String getToken() { 15 return token; 16 } 17 } 新增token来验证线程安全 来个线程安全的 public class SingletonHungrySafe { private static String token; //jvm加载时会实例化 private static class Holder { private static SingletonHungrySafe INSTANCE = new

架构设计之-单例模式

ε祈祈猫儿з 提交于 2020-01-29 11:06:22
先来说说为什么要使用单例模式进行架构方面的设计,那就是单例模式的优点: 1.单例模式只有一个实例,节省了内存资源,对于一些需要频繁创建和销毁的对象,使用单例模式可以提高系统性能 2.单例模式可以设置系统的全局访问点,优化和共享数据。常见的系统架构设计中会经常使用单例模式就行设计,用来创建一个实例来就行读取相应的一些配置文件和公共类 代码实现: 1、饿汉式 (可用) public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } } 这是比较常见的写法,在类加载的时候就完成了实例化,避免了多线程的同步问题。当然缺点也是有的,因为类加载时就实例化了,没有达到Lazy Loading (懒加载) 的效果,如果该实例没被使用,内存就浪费了。 2、普通的懒汉式 (线程不安全,不可用) public class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton getInstance

单例模式

若如初见. 提交于 2020-01-29 04:30:41
(一)、单例模式 设计模式:基于类做的一些设计,以此来实现数据封装的管理 单例模式:最常见的一种设计模式,经常被考到(单例模式:一个类只能生成一个实例) #单例模式的本质:做实例化的时候,判断有没有类变量_instance, 如果没有,生成一个Singleton的父类对象object的实例,赋值给_instance(只会做一次),返回cls._instance 如果有这个_instance类变量,直接返回cls._instance (或者本质这样理解:通过__new__的if判断逻辑,判断是否生成过实例地址,如果没生成,生成一个,生成了呢?就用老的那个地址。) class Singleton(object): def __init__(self): self.c=1000 def __new__(cls, *args, **kw): #规定,__new__必须返回一个实例(当前类的实例或者父类的实例) #如果cls这个类没有类变量_instance,则会执行if下的代码 if not hasattr(cls, '_instance'): orig = super(Singleton, cls) #找到父类的类对象object,也可以写成orig = super() cls._instance = orig.__new__(cls, *args, **kw) #可以写成不带参数

JS 基础篇(单例模式)

与世无争的帅哥 提交于 2020-01-29 02:49:11
以弹窗为例 < ! DOCTYPE html > < html lang = "en" > < head > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > < meta http - equiv = "X-UA-Compatible" content = "ie=edge" > < title > 单例模式 < / title > < / head > < body > < button type = "button" id = "btnpop" > 弹出 < / button > < button type = "button" id = "btnframe" > iframe < / button > < script > //把变 的部分封装,不变的隔离 ,开发-封闭原则 function createEl ( fn ) { var result ; return function ( ) { if ( ! result ) { result = fn . apply ( this , arguments ) ; } return result ; } } function createWindow ( ) {

记录一下常考的Python面试题

谁说我不能喝 提交于 2020-01-28 10:29:52
Python实现单例模式?什么是单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。 #实现单例模式的几种方式: #方法一 使用new方法 class Singleton ( object ) : def __new__ ( cls , * args , ** kw ) : if not hasattr ( cls , '_instance' ) : orig = super ( Singleton , cls ) cls . _instance = orig . __new__ ( cls , * args , ** kw ) return cls . _instance class MyClass (

设计模式之创建型模式---单例模式

牧云@^-^@ 提交于 2020-01-28 09:46:26
单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 核心思想:构造函数必须私有制。 使用场景: 1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。 注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。 单例模式的六种创建形式: 1、懒汉式,线程不安全 是否 Lazy 初始化:是 是否多线程安全:否 实现难度:易 描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以 严格意义上它并不算单例模式。 这种方式