摘要:单例模式是一种常见的设计模式。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数, 有利于Java垃圾回收(garbage collection)。
一、单例模式也是一种比较常见的设计模式,它到底能带给我们什么好处呢?其实无非是三个方面的作用:
1、控制资源的使用,通过线程同步来控制资源的并发访问;
2、控制实例产生的数量,达到节约资源的目的。
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
二、常见的单例模式有两种:懒汉式单例、饿汉式单例。
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
1)饿汉式单例
在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
package com.zad.my_encapsulation_single;
/**
* 单例模式-饿汉式
* 1、构造器私有化
* 2、提供私有的静态属性 ,创建该对象
* 3、提供公共的静态方法来访问该引用
* @author zhongaidong
*/
public class EagerSingleton {
// 2、提供私有的静态属性,在类加载的时候就创建该单例对象
private static EagerSingleton eager = new EagerSingleton();
// 1、构造器私有化,内部创建对象,避免外部创建实例
private EagerSingleton() {
}
// 3、提供公共的静态方法来访问该引用,返回此类的唯一实例.
public static EagerSingleton getInstance() {
return eager;
}
}
2)懒汉式单例
在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。
/**
* 单例模式-懒汉式
* 1、构造器私有化
* 2、提供私有的静态属性
* 3、提供公共的静态方法来访问该引用
* @author zhongaidong
*/
public class LazySingleton {
// 2、提供私有的静态属性,加载时候不做初始化
private static LazySingleton lazy;
// 1、构造器私有化,内部创建对象,避免外部创建实例
private LazySingleton() {
}
// 3、提供公共的静态方法来访问该引用。
public static LazySingleton getInstance() {
if (lazy == null) {
lazy = new LazySingleton();
}
return lazy;
}
}
三、如何使用单例对象
/**
* 如何使用单例对象。
*
* @author zhongaidong
*/
public class App {
public static void main(String[] args) {
// EagerSingleton eager =new EagerSingleton(); // 不能这样调用。
EagerSingleton eager = EagerSingleton.getInstance();
System.out.println(eager);
System.out.println(EagerSingleton.getInstance());
LazySingleton lazy = LazySingleton.getInstance();
System.out.println(lazy);
System.out.println(LazySingleton.getInstance());
}
}