(面试常问)4种单例设计模式的总结(内含代码以及分析)

单例设计模式:

    单例模式,是一种常见的软件设计模式.在它的核心结构中只包含了一个被称为单例的特殊类.通过单例模式可以保证系统中只有该类的一个实例对象.

优点 :

    实例控制:单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保所有对象都访问的是唯一的实例 

    灵活性:因为类控制了实例化过程,所以类可以很灵活的更改实例化的过程

实现单例需要如下几步(基础):

    1私有化构造函数

    2创建一个本类对象

    3 向外提供一个方法,返回这个本类对象

1饿汉式

    优点:线程安全,允许多个线程同时访问

    缺点:会提前初始化单例对象(在类加载的时候)

1 1 /** 2 2 * @Author : zhuhuicong 3 3 * 2018/11/27 21:08 4 4 * @Version 1.0 5 5 * 懒汉式 6 6 */ 7 7 public class SingalDemo01 { 8 8 private static SingalDemo01 singalDemo01 = new SingalDemo01(); 9 9 private SingalDemo01() { 1010 } 1111 1212 public static SingalDemo01 getInstance(){ 1313 return singalDemo01; 1414 } 1515 }

View Code

2懒汉式:

    优点:不会提前初始化单例对象

    缺点:线程不安全

        解决方案可以通过加锁进行解决,但是加锁之后,效率低

1 1 /** 2 2 * @Author : zhuhuicong 3 3 * 2018/11/27 21:12 4 4 * @Version 1.0 5 5 */ 6 6 public class SingalDemo02 { 7 7 private static SingalDemo02 singalDemo02 = null; 8 8 private SingalDemo02() { 9 9 } 1010 public static synchronized SingalDemo02 getInstance(){ 1111 if(singalDemo02==null){ 1212 singalDemo02 = new SingalDemo02(); 1313 } 1414 return singalDemo02; 1515 } 1616 }

View Code

3 双重检测锁机制:

    线程安全并且不会提前初始化实例对象(注意两次判断检测的作用)

1 1 /** 2 2 * @Author : zhuhuicong 3 3 * 2018/11/27 21:17 4 4 * @Version 1.0 5 5 */ 6 6 public class SingalDemo03 { 7 7 private static SingalDemo03 singalDemo03 = null; 8 8 private SingalDemo03() { 9 9 } 1010 1111 public static SingalDemo03 getInstance(){ 1212 if(singalDemo03==null){ //第一个if是为了避免每次进来都加锁,提高效率 1313 synchronized (SingalDemo03.class){ 1414 if(singalDemo03==null){ //第二个if是为了避免生成多个实例对象 1515 singalDemo03 = new SingalDemo03(); 1616 } 1717 } 1818 } 1919 return singalDemo03; 2020 } 2121 }

View Code

4静态内部类的方式:

    线程安全,并且不会提前初始化(对象只会在内部类加载的时候初始化,内部类只会在调用getInstance()方法的时候加载)

 

1 1 /** 2 2 * @Author : zhuhuicong 3 3 * 2018/11/27 21:24 4 4 * @Version 1.0 5 5 */ 6 6 public class SingalDemo04 { 7 7 private SingalDemo04() { 8 8 } 9 9 1010 public static class Inner{ 1111 public static SingalDemo04 Instance; 1212 } 1313 1414 public static SingalDemo04 getInstance(){ 1515 return Inner.Instance; 1616 } 1717 }

View Code

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Golang 常见设计模式之单例模式

之前我们已经看过了Golang常见设计模式中的装饰和选项模式,今天要看的是Golang设计模式里最简单的单例模式。单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在。根据这一特性,我们可以将其应用到全局唯一性配置、数据库连接对象、文件访问对象等。Go语言实现单例模式的方法有很多种,下面我们就一起来看一下。饿汉式饿汉式实现单例模式非

java设计模式1

1:单例模式简介  单例模式是一种常用的软件设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供唯一的实例。总而言之就是在系统中只会存在一个对象,其中的数据是共享的  特点:    单例类只能有一个实例,所以一般会用static进行修释。    单例类必须自己创建自己的唯一实例。也就是在类中要new一个自己。    单例类必

java 23种设计模式(五、单例模式)

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式的结构  单例模式的特点:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。  饿汉式单例类publicclassEagerSingleton

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

什么是单例设计模式?顾名思义,只有一个实例。单例模式它主要是确保一个类只有一个实例,并且可以提供一个全局的访问点。废话少说,直接上干货了单例模式之饿汉式所谓饿汉式,顾名思义,“它很饿”。所以说,它一旦被加载进来,就会直接实例化一个对象。例如:languageclassSingleton{privatestaticfin

JAVA设计模式之单例设计模式

    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。  在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:  1.限制类实例化对象。即只能产生一个对象。