设计模式-单例模式

130 阅读3分钟

介绍

官方定义

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)

举个最常见的例子,Spring 中的 bean 默认都是单例模式,每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例

单例模式八种实现方式

  • 饿汉式(静态常量)

  • 饿汉式(静态代码块)

  • 懒汉式(线程不安全)

  • 懒汉式(线程安全,同步方法)

  • 懒汉式(线程安全,同步代码块)

  • 双重检查

  • 静态内部类

  • 枚举方式

饿汉式(静态常量)

class Singleton{

//一:构造器的私有化 防止外部用构造器...

private Singleton(){}

//二:类的内部创建对象 final static

private static final Singleton singleton = new Singleton();

//三:对外提供公共的静态方法 返回该类唯一的对象实例

public static Singleton getInstance(){

return singleton;

}

}

优点: 简单 避免多线程的同步问题

缺点:没有达到懒加载的效果 内存的浪费

饿汉式(静态代码块)

class Singleton{

//构造器私有化

private Singleton(){}

//类的内部创建对象

private static final Singleton singleton;

static {

  singleton = new Singleton();

}

//对外提供公共的静态的方法

public static Singleton getInstance(){

  return singleton;

 }

}

优点: 简单 避免多线程的同步问题

缺点:没有达到懒加载的效果 内存的浪费

懒汉式(线程不安全)

class Singleton{

//构造器私有化

private Singleton(){}

//类的内部提供对象

private static Singleton singleton;

//对外提供公共的静态方法的时候,来判断

public static Singleton getInstance(){

if (singleton == null){

singleton = new Singleton();

}

return singleton;

}
}

优点: 起到了懒加载的效果 不会造成内存浪费

缺点:线程不安全 不推荐这种方式的

懒汉式(同步方法)

class Singleton{

//构造器私有化

private Singleton(){}

//类的内部提供对象

private static Singleton singleton;

//对外提供公共的静态方法的时候,来判断

public static synchronized Singleton getInstance(){

if (singleton == null){

singleton = new Singleton();

}

return singleton;

}

}

优点: 起到了懒加载的效果 不会造成内存浪费,且线程安全

缺点:效率太低

懒汉式(同步代码块)

class Singleton{

//构造器私有化

private Singleton(){}

//类的内部提供对象

private static Singleton singleton;

//对外提供公共的静态方法的时候,来判断

public static Singleton getInstance(){

if (singleton == null){
synchronized (Singleton.class){ //失去了意义

singleton = new Singleton();

}

}

return singleton;

}

}

优点: 起到了懒加载的效果 不会造成内存浪费

缺点:解决不了线程的安全问题,不推荐

双重检查机制

class Singleton{

private Singleton(){}

private static Singleton singleton;

//加入双重检查机制

public static Singleton getInstance(){

if (singleton == null){

synchronized (Singleton.class){
if (singleton == null){

singleton = new Singleton();

}

}

}

return singleton;

}

}

优点: 起到了懒加载的效果 不会造成内存浪费,且线程安全,效率较高,推荐使用

缺点:

静态内部类

class Singleton{

private Singleton(){}

private static class SingletonInstance{

public static final Singleton INSTANCE = new Singleton();

}

public static Singleton getInstance(){

return SingletonInstance.INSTANCE;

}

}

优点: 利用静态内部类的特点,效率也很高,实际开发中推荐使用的

缺点:

枚举方式

enum Singleton{

INSTANCE; //属性

}

优点: 不仅可以避免线程安全问题 推荐大家使用

缺点:

单例模式的使用场景

  • 对于一些需要频繁创建销毁的对象

  • 重量级的对象

  • 经常使用到的对象

  • 工具类对象

  • 数据源,session。。。。