单例模式

什么是设计模式

设计模式( Design Pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

使用设计模式的目的

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

Java设计模式有哪些

基本模式有23种:

  • 单例模式
  • 抽象工厂模式
  • 建造者模式
  • 工厂模式
  • 原型模式
  • ……

单例模式

在开发过程中,有些对象我们只需要一个,比如配置文件、工具类、线程池、缓存、日志对象等。
如果创造出多个实例,就会导致许多问题,比如占用过多资源,不一致的结果等

单例模式分类

常用的单例模式有两种,一种叫懒汉模式,一种叫饿汉模式。

饿汉模式

步骤

1.将构造方法私有化,不允许外部直接创建对象
2.在类内部创建类的唯一实例,使用private static修饰
3.提供一个用于获取实例的方法,使用public static修饰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Singleton 
{
//1.将构造方法私有化,不允许外部直接创建对象
private Singleton()
{
}
//2.创建类的唯一实例,使用private static修饰
private static Singleton instance=new Singleton();
//3.提供一个用于获取实例的方法,使用public static修饰
public static Singleton getInstance(){
return instance;
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args)
{
// 饿汉模式
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1 == s2)
{
System.out.println("s1和s2是同一个实例");
} else
{
System.out.println("s1和s2不是同一个实例");
}
}

运行结果

1
s1和s2是同一个实例

为什么叫饿汉模式

不管程序是否需要这个对象的实例,总是在类加载的时候就先创建好实例,理解起来就像不管一个人想不想吃东西,他都把吃的先买好存着,如同饿怕了一样。

懒汉模式

步骤

  • 将构造方式私有化,不允许外边直接创建对象
  • 在类内部声明类的唯一实例,使用private static修饰
  • 提供一个用于获取实例的方法,使用public static修饰。当第一个用户来获取的时候,才创建一个实例,后面就不需要创建了。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class Singleton2
    {
    // 1.将构造方式私有化,不允许外边直接创建对象
    private Singleton2()
    {
    }
    // 2.声明类的唯一实例,使用private static修饰
    private static Singleton2 instance;
    // 3.提供一个用于获取实例的方法,使用public static修饰
    public static synchronized Singleton2 getInstance()
    {
    //第一次获取的时候,创建实例
    if (instance == null)
    {
    instance = new Singleton2();
    }
    return instance;
    }
    }

测试

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args)
{
// 懒汉模式
Singleton2 s3 = Singleton2.getInstance();
Singleton2 s4 = Singleton2.getInstance();
if (s3 == s4) {
System.out.println("s3和s4是同一个实例");
} else {
System.out.println("S3和s4不是同一个实例");
}
}

运行结果

1
s3和s4是同一个实例

为什么叫懒汉模式

当程序需要这个实例的时候才去创建对象,就如同一个人懒的饿到不行了才去吃东西

区别

  • 饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全
  • 懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,线程不安全

如果一个对象使用频率不高,占用内存还特别大,明显就不合适用饿汉式了。这时应该使用懒汉模式。

参考链接

为什么单例模式要起名叫饿汉式和懒汉式?
慕课网 单例模式