创建型模式之单例模式

定义

1、定义:

确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

常见应用场景:

  1. 项目中读取配置文件的类,一般也只有一个对象。没必要每次使用配置文件的时候,都new一个对象去读取;
  2. 数据库连接池的设计一般是单利模式,因为数据库的连接是很耗资源的;
  3. 在servlet中的Application也是单利模式;
  4. 在Spring中,每个Bean都是单利的,这样的优点就是Spring容器可以去管理;
  5. 在Servet编程中,每个servlet也是单例的;
  6. springMVC中的控制器也是单例的;

2、类图

  

1.类图分为三部分,依次是类名、属性、方法

2.以<<开头和以>>结尾的为注释信息

3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可见。

4.带下划线的属性或方法代表是静态的。

单例模式,它有以下几个要素:

  • 私有的构造方法
  • 指向自己实例的私有静态引用
  • 以自己实例为返回值的静态的公有的方法

3、分类

常见的四种单例模式的实现方式:

  -饿汉式(线程安全,调用效率高,不能延时加载)

  -懒汉式(线程安全,调用效率不高,可延时加载)

  -静态内部类式(线程安全,调用效率高,可延时加载)

  -枚举单例(线程安全,调用效率高,不能延时加载,并且可以避免通过反射和序列化创建新对象)

饿汉式

所谓“懒汉式”与“饿汉式”的区别,是在于建立单例对象的时间不同。“懒汉式”是在你真正用到的时候才去建这个单例对象:

/饿汉式
public class SingletonTest01 {
    //类初始化装载的时候,初始化该对象(类初始化是天然的线程安全)
    private static SingletonTest01 instance = new SingletonTest01();
    // 私有的构造器
    private SingletonTest01() {
    }
    // 方法没有同步块,并发效率高
    public static SingletonTest01 getInstance() {
        return instance;
    }
}

懒汉式

/单例模式:懒汉式
public class SingletonTest02 {

    //类初始化装载的时候,不初始化该对象(延时加载,真正使用的时候再创建)
    private static SingletonTest02 instance;
private SingletonTest02() { } //方法需同步保证线程安全,调用效率低 public static synchronized SingletonTest02 getInstance() { if (instance != null) { return instance; } else { return new SingletonTest02(); } } }
原文地址:https://www.cnblogs.com/airsen/p/6206821.html