单例模式

单例模式--登陆框

你说的曾经没有我的故事 提交于 2020-01-08 11:09:44
1 // 例2 === 模拟登陆框 2 class LoginForm { 3 constructor() { 4 this.state = 'hide' // 存储当前显示,隐藏状态 5 } 6 show() { 7 if (this.state === 'show') { 8 alert('已经显示') 9 return 10 } 11 this.state = 'show' 12 console.log('登陆框显示') 13 } 14 hide() { 15 if (this.state === 'hide') { 16 alert('已经隐藏') 17 return 18 } 19 this.state = 'hide' 20 console.log('登陆框已隐藏') 21 } 22 } 23 // 单例模式开启=> 24 LoginForm.getInstance = (function() { 25 let instance // 寄存new出来的LoginForm实例 确保唯一性 26 return function() { 27 if (!instance) { // 判断instance是否有值 28 instance = new LoginForm() 29 } 30 return instance 31 } 32 })() 33 34 window.p1

单例模式分析

六月ゝ 毕业季﹏ 提交于 2020-01-07 19:22:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 单例模式,这个搞java的应该都懂,对于那些有缺陷的单例模式就不说了,太low,这里说下相对略叼的两种。 一、双重校验锁 先上代码: package com.ayo.singleton; import java.io.*; /** * 双重校验锁单例模式 * * @Authror ayo * @Date 2020/1/7 14:33 */ public class LanhanSingleton implements Serializable { private volatile static LanhanSingleton INSTANCE; private LanhanSingleton() {} public static LanhanSingleton getInstance(){ if(INSTANCE == null){ synchronized (LanhanSingleton.class){ if (INSTANCE == null){ INSTANCE = new LanhanSingleton(); } } } return INSTANCE; } } 双重校验锁基本上算是比较完善的单例模式了(大部分场景下),但是它还是有缺点的,因为如果按照这么写并不能真正的保证单例,最简单的就是用反射搞你

单例模式防止反射和反序列化漏洞

扶醉桌前 提交于 2020-01-07 11:54:54
一、懒汉式单例模式,解决反射和反序列化漏洞 public static void main(String[] args) throws Exception { SingletonDemo1 sc1 = SingletonDemo1.getInstance(); SingletonDemo1 sc2 = SingletonDemo1.getInstance(); System.out.println(sc1); // sc1,sc2是同一个对象 System.out.println(sc2); // 通过反射的方式直接调用私有构造器(通过在构造器里抛出异常可以解决此漏洞) // Class<SingletonDemo1> clazz = (Class<SingletonDemo1>) Class.forName("com.sankuai.ia.demo.web.service.SingletonDemo1"); // Constructor<SingletonDemo1> c = clazz.getDeclaredConstructor(null); // c.setAccessible(true); // 跳过权限检查 // SingletonDemo1 sc3 = c.newInstance(); // SingletonDemo1 sc4 = c.newInstance();

C#-关于带参数的单例模式的思考(利用带参数的单例模式连接并查询数据库特定表的信息)

这一生的挚爱 提交于 2020-01-06 15:36:59
首先,让我们看一下单例模式是怎样的。 public sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (instance == null) { instance = new Singleton(); } } } return instance; } } } 这是<<C# in Depth>>这本书中提供的标准代码。 实现单例模式的思路是: 定义一个密封类(sealed)以避免其它类继承此类(据书中所说此举虽然不是必要的,但可以帮助JIT进行更多优化)。 定义并初始化该类自身的静态实例(instance)为null,用该instance来检测控制在创建单例模式的类的程序中只有一个该类的实例。 定义并初始化一个只读(readonly)的用于锁(lock)的object对象以满足多线程环境。 创建一个只有get方法的该类的静态变量,用于创建该类的实例。 最后在该类的构造函数中写入相关代码。

Java 面向对象 --单例模式

孤人 提交于 2020-01-05 07:26:53
在长期的程序设计过程中,开发者们总结出了很多设计经验,最终经过整理和优化,变成了如今的设计模式; 设计模式有很多 有单例,工厂,代理等等。这里推荐一本关于Java设计模式的书籍 Head First设计模式 今天我们这里讲解的是最常用的单例模式; 在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在; 有两种实现,一种是饿汉式,一种是懒汉式; 我们上下代码,先上 饿汉式实现: package com.java1234.chap03.sec18; public class Singleton { /** * 构造方法私有 */ private Singleton(){ } /** * 饿汉式单例实现 */ private static final Singleton single=new Singleton(); /** * 获取实例 */ public static Singleton getInstance(){ return single; } } 这里我们构造方法私有 这样就保证了在外部是无法来实例化对象; 然后我们先在内部定义一个静态常量对象,然后再写一个static方法 来返回这个对象,这样就保证是一个对象了; package com.java1234.chap03.sec18; public class Test { public static

java的单例设计模式

扶醉桌前 提交于 2020-01-05 07:26:39
单例设计模式是java的一种设计模式,它是指在设计一个类时,要保证在整个程序运行期间针对该类内存中只存在一个实例对象。 单例设计模式包括饿汉式和懒汉式两种模式。 饿汉式:类一加载进内存就创建好了对象; 饿汉式的代码如下: package com.sjk.sheng; /** * 单例模式之饿汉式 * @author sjk * */ public class Single { //将构造函数私有化,不让别的类建立该类对象 private Single(){} //自己建立一个对象 private static final Single s = new Single(); //提供一个公共访问方式 public static Single getInstance() { return s; } } 懒汉式:类加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,对象才开始创建。 懒汉式的代码如下: package com.sjk.sheng; /** * 单例模式之懒汉式 * @author sjk * */ public class Single { private Single(){} private static Single s; public static Single getInstance() { if(s==null) /

设计模式之单例模式——只有一个实例

孤人 提交于 2020-01-04 00:20:15
目录 一 单例模式简介 1.1 定义 1.2 为什么要用单例模式呢? 1.3 为什么不使用全局变量确保一个类只有一个实例呢? 二 单例的模式的实现 2.1 饿汉方式(线程安全) 2.2 懒汉式(非线程安全和synchronized关键字线程安全版本 ) 2.3 懒汉式(双重检查加锁版本) 2.4 懒汉式(登记式/静态内部类方式) 2.5 饿汉式(枚举方式) 2.6 总结 一 单例模式简介 1.1 定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 1.2 为什么要用单例模式呢? 在我们的系统中,有一些对象其实我们只需要一个,比如说: 线程池、缓存、对话框、注册表、日志对象、充当打印机、显卡等设备驱动程序的对象。事实上,这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生,比如:程序的行为异常、资源使用过量、或者不一致性的结果。 简单来说使用单例模式可以带来下面几个好处: 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销; 由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。 1.3 为什么不使用全局变量确保一个类只有一个实例呢? 我们知道全局变量分为静态变量和实例变量,静态变量也可以保证该类的实例只存在一个。 只要程序加载了类的字节码

设计模式--单例模式

我的未来我决定 提交于 2020-01-02 00:29:31
所谓类的单例设计模式,就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 单例模式一共有八种实现方式 1)饿汉式(静态常量) 2)饿汉式(静态代码块) 3)懒汉式(线程不安全) 4)懒汉式(线程安全,同步方法) 5)懒汉式(线程安全,同步代码块)错误,可能出现多个实例 6)双重检查 7)静态内部类 8)枚举 饿汉式会在反射或序列化反序列化时破坏单例 一、饿汉式(静态常量) 优缺点说明: 1)优点:写法简单,在类装载的时候就完成实例化。避免了线程同步问题。 2)缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终没用使用过这个实例,则会造成内存的浪费。 3)这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,在单例模式中大多数都是调用getInstance方法,但是导致类装载的原因有很多种,因此不能确定有其他的方法(或者其它的静态方法)导致类装载,这时候初始化isntance就没有达到lazy loading的效果。 4)结论:这种单例模式可用,可能造成内存浪费。 二、饿汉式(静态代码块) 优缺点同饿汉式(静态常量) 三、懒汉式(线程不安全) 四、懒汉式(线程安全,同步方法) 优缺点说明: 1)解决了线程不安全的问题 2

Java 单例模式全面学习

本小妞迷上赌 提交于 2019-12-31 13:45:16
介绍 什么是单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 解决什么问题:省略创建对象所花费的时间,不需要频繁创建对象,减轻 GC 压力。 单例模式有以下几种实现方式: 线程安全 并发性能好 可以延迟加载 序列化/反序列化安全 能抵御反射攻击 饿汉式 Y Y 懒汉式-不加锁 Y Y 懒汉式-加锁 Y Y 双重检查 Double Check Y Y Y 静态内部类 Y Y Y 枚举 Y Y Y 懒汉式 第一次使用的时候才进行加载 // 非线程安全 public class Singleton { private Singleton(){} private static Singleton singleton; public static Singleton getSingleton(){ if (singleton == null){ singleton = new Singleton(); } return singleton; } } // 加锁线程安全,但是每次获取都会加锁判断 public class Singleton { private Singleton(){} private static Singleton singleton; public static synchronized Singleton getSingleton(){ if

【GOF23设计模式】--单例模式

∥☆過路亽.° 提交于 2019-12-30 05:18:12
核心作用 : 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 常见应用场景 windows 的任务管理器 windows 的回收站 项目中,读取配置文件的类 网站的计数器,否则难以同步 应用程序的日志应用,一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加 数据库连接池的设计一般也是采用单例,因为数据库连接是一种数据库资源 Se rvlet 的 Appli cation 内置对象 Servlet 编程中每个 servlet 也是单例的 Spring 中每个 bean 默认就是单例的,这样做的有点是 spring 容器可以管理 spring mvc 框架 /struts1 框架,控制器对象也是单例 单例模式的优点: 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理 常见的五种单例模式实现方式 主要 : 饿汉式(线程安全,调用效率高。但是,不能延时加载) 懒汉式(线程安全,调用效率不高。但是,可以延时加载) 其他: 双重检测锁式(由于 JVM 底层内部模型原因,偶尔会出现问题,不建议使用)