单例模式

单例模式

我与影子孤独终老i 提交于 2020-02-24 10:43:42
1.饿汉式即静态初始化的方式,它是类一加载就实例化的对象,所以要提前占用系统资源。 2.懒汉式,面临着多线程访问的安全性问题,需要做双重锁定才能保证安全。 3.饿汉式的单例类已经足够满足我们的需求 饿汉式(推荐) 优点 1.线程安全 2.在类加载的同时已经创建好一个静态对象,调用时反应速度快 缺点 资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化 懒汉式:单例实例在第一次被使用时构建,延迟初始化。 优点: 避免了饿汉式的那种在没有用到的情况下创建事例,资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法。 缺点: 懒汉式在单个线程中没有问题,但多个线程同事访问的时候就可能同事创建多个实例,而且这多个实例不是同一个对象,虽然后面创建的实例会覆盖先创建的实例,但是还是会存在拿到不同对象的情况。解决这个问题的办法就是加锁synchonized,第一次加载时不够快,多线程使用不必要的同步开销大。 以下都是单例模式的经典使用场景: 1.资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。 2.控制资源的情况下,方便资源之间的互相通信。如线程池等。 应用场景举例: 1.外部资源:每台计算机有若干个打印机

23种设计模式之单例模式

隐身守侯 提交于 2020-02-24 10:43:21
单例模式:确保一个类最多只有一个实例,并提供一个全局访问点 普通单例模式示例(有问题) public class Singleton { private static Singleton uniqueInstance = null; private Singleton() { } public static Singleton getInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } } 示例Singleton public class ChocolateFactory { private boolean empty; private boolean boiled;//是否加热过 private static ChocolateFactory uniqueInstance = null; private ChocolateFactory() { empty = true; boiled = false; } public static ChocolateFactory getInstance() { if (uniqueInstance == null) { uniqueInstance = new

java 单例模式

随声附和 提交于 2020-02-24 10:42:25
1. 单例模式 (1)概念 单例模式的定义是:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 (2)类图、代码 单例模式的类图设计如下: 单例模式中的主动实例化(加载类时实例化单例类)[推荐使用]: //主动实例化的单例模式--饿汉式单例 public class Singleton { // 自行实例化一个对象 private static final Singleton singleton = new Singleton(); // 私有构造函数,只允许自行实例化对象 private Singleton() { } // 公开唯一对象的调用方法,供外部调用 public static Singleton getInstance() { return singleton; } } 外部通过代码Singleton singleton = Singleton.getInstance();来调用这个实例。 该方法的优点是:能保证 线程安全 (适用于单、多线程)。 该方法的缺点是:在加载类时实例化导致该static对象一直保存在内存中, 无论是否使用都占着内存空间 。( 饿汉式”的由来:不管你用的用不上,一开始就建立这个单例对象 ) 单例模式中的被动实例化(调用方法时实例化单例类): //被动实例化的单例模式--懒汉式单例 public class Singleton

单例模式

狂风中的少年 提交于 2020-02-24 10:41:19
一、什么是单例? 确保一个类只有一个实例,并提供一个全局访问点 二、应用 线程池、缓存、数据库等,只需要一个实例,如果多个实例 会造成异常情况 三、简单实现 1)懒汉式简单实现 ①public class Singleton{   private static Singleton singleton;   private Singleton(){}   public static Singleton getInstance(){     if(singletn==null){//位置一       singleton = new Singleton();     }     return singleton;   } } 注:简单的实现对于多线程会有问题,第一次创建singleton时,线程1正在执行位置一,同时线程2又需要一个singleton的实例,她也执行到位置一,致使线程1,2都获取到一个singleton的实例,造成出现两个singleton实例 ②解决多线程的问题,加入synchronized同步锁,只准一个进入去创建实例,重新写getInstance方法 public static synchronized Singleton getInstance(){     if(singletn==null){//位置一       singleton = new

JS常用的三种设计模式

拈花ヽ惹草 提交于 2020-02-24 01:01:16
1.单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。– 百度百科 单例模式是一种常用的模式,有一些对象我们往往只需要一个, 比如线程池、全局缓存、浏览器中的window对象等。在JavaScript开发中,单例模式的用途同样非常广泛。试想一下,当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的, 无论单击多少次登录按钮,这个浮窗都只会被创建一次, 那么这个登录浮窗就适合用单例模式来创建。 下面是单例模式的 核心代码 : // 准备一个构造函数 // 将来要 new 的 function Person ( ) { } // 准备一个单例模式函数 // 这个单例模式函数要把 Person 做成一个单例模式 // 将来再想要 new Person 的时候只要执行这个 singleton 函数就可以了 function singleton ( ) { let instance if ( ! instance ) { //如果 instance 没有内容 //来到这里,证明 instance 没有内容 //给他赋值为 new Person instance = new Person ( ) } //返回的永远都是第一次 new Person 的实例 //也就是永远都是一个实例 return instance } const p1 = singleton

设计模式——单例模式

大城市里の小女人 提交于 2020-02-22 22:29:46
单例模式 什么是单例模式? 单例模式指,采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类肢体东一个取得其对象实例的方法(静态方法) e.g. : Hibernate中的Session Factory。 它否则创建Session对象,一个项目通常只需要一个SessionFactory就够。 饿汉式——静态常量 构造器私有化(使用 private, 防止 new) 类的内部创建实例对象,用final 和 static 关键词修饰 向外暴露一个静态的公共方法 (getInstance) //饿汉式(静态常量) class Singleton { //1. 构造器私有化,外部不能new private Singleton(){} //2. 本类内部创建对象实例 private final static Singleton instance = new Singleton(); //3. 对外提供一个公有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } } 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。 优点 写法简单,在类装载的时候就完成实例化。避免了线程同步问题

单例模式的七种写法

橙三吉。 提交于 2020-02-22 15:27:34
1.适用场合 需要频繁的进行创建和销毁的对象; 创建对象时耗时过多或耗费资源过多,但又经常用到的对象; 工具类对象; 频繁访问数据库或文件的对象。 2.如何实现? 第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。 第二种(懒汉,线程安全): Java代码 public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种写法能够在多线程中很好的工作

设计模式_单例模式

微笑、不失礼 提交于 2020-02-22 11:00:56
单例模式概述 1、核心: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。 2、单例模式的优点: 1)由于单例模式只生成一个实例对象,减少了系统的性能开销。当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决 2)单例模式可以在系统设置全局的访问点,优化共享资源的访问,例如可以设计一个单例类,负责所有数据表的映射处理 常见的五种单例模式实现方式: 1、饿汉式(线程安全,调用效率高。但是,不能延时加载。) /* * 测试单例模式 * * 饿汉模式 */ public class SingletonDemo1 { //类初始化时立即加载对象(没有延迟加载的优势),天然的线程安全 private static SingletonDemo1 instance = new SingletonDemo1 ( ) ; //构造器私有化 private SingletonDemo1 ( ) { } //方法没有同步,调用效率高 public static SingletonDemo1 getInstance ( ) { return instance ; } } 2、懒汉式(线程安全,调用效率不高。但是,可以延时加载。) /* * 测试单例模式 * * 懒汉模式 */ public class

单例模式(Singleton)

匆匆过客 提交于 2020-02-21 11:34:41
http://www.cnblogs.com/BoyXiao/archive/2010/05/07/1729376.html 懒汉式单例 public class Singleton { // 定义一个私有的静态全局变量来保存该类的唯一实例 private static Singleton singleton; // 定义一个只读静态对象 // 且这个对象是在程序运行时创建的 private static readonly object syncObject = new object (); /// <summary> /// 构造函数必须是私有的 /// 这样在外部便无法使用 new 来创建该类的实例 /// </summary> private Singleton() { } /// <summary> /// 定义一个全局访问点 /// 设置为静态方法 /// 则在类的外部便无需实例化就可以调用该方法 /// </summary> /// <returns></returns> public static Singleton GetInstance() { // 这里可以保证只实例化一次 // 即在第一次调用时实例化 // 以后调用便不会再实例化 // 第一重 singleton == null if (singleton == null ) { lock

下面来看

别说谁变了你拦得住时间么 提交于 2020-02-20 16:55:29
来避免两个打印作业同时输出到打印机中, 即在整个的打印过程中我只有一个打印程序的实例。 简单说来, 下面来看 从上面的类图中可以看出,在单例类中有一个构造函数 Singleton , 但是这个构造函数却是私有的(前面是“ - ”符号), 然后在里面还公开了一个 GetInstance()方法, 通过上面的类图不难看出 单例模式 的定义 Singleton 类 namespace Singleton { public class Singleton { //定义一个私有的静态全局变量来保存该类的唯一实例 private static Singleton singleton; /// <summary> /// 构造函数必须是私有的 /// 这样在外部便无法使用 new 来创建该类的实例 /// </summary> private Singleton () { } /// <summary> /// 定义一个全局访问点 /// 设置为静态方法 /// 则在类的外部便无需实例化就可以调用该方法 /// </summary> /// <returns></returns> public static Singleton GetInstance () { //这里可以保证只实例化一次 //即在第一次调用时实例化 //以后调用便不会再实例化 if ( singleton == null )