声明:此处代码都是引用私塾Java设计模式
1.定义
保证一个类只有一个实例,并提供一个访问它的全局访问点。
2.常见实现方式:懒汉式和饿汉式
下面介绍两种实现方式:懒汉式
public class Singleton { /** * 定义一个变量来存储创建好的类实例 */ private static Singleton uniqueInstance = null; /** * 私有化构造方法,好在内部控制创建实例的数目 */ private Singleton(){ // } /** * 定义一个方法来为客户端提供类实例 * @return 一个Singleton的实例 */ public static synchronized Singleton getInstance(){ //判断存储实例的变量是否有值 if(uniqueInstance == null){ //如果没有,就创建一个类实例,并把值赋值给存储类实例的变量 uniqueInstance = new Singleton(); } //如果有值,那就直接使用 return uniqueInstance; } }
饿汉式
/** * 饿汉式单例实现的示例 */ public class Singleton { /** * 定义一个变量来存储创建好的类实例,直接在这里创建类实例,只会创建一次 */ private static Singleton uniqueInstance = new Singleton(); /** * 私有化构造方法,好在内部控制创建实例的数目 */ private Singleton(){ // } /** * 定义一个方法来为客户端提供类实例 * @return 一个Singleton的实例 */ public static Singleton getInstance(){ //直接使用已经创建好的实例 return uniqueInstance; } }
上面是常见的两种单例模式的实现方式,通过上面两中实现方式可以总结出单例模式的实现步骤:
- 私有化构造函数,控制实例化数目
- 提供一个全局访问点,为客户端提供类实例
- 该全局访问点一定要加上static,为类方法
- 定义一个变量来存储定义好的类实例
- 因为该变量要在静态方法中应用所以要加static
3.懒汉式和饿汉式的简单比较
饿汉式在类加载的时候,就加载了类实例,而懒汉式只有在调用全局访问点时才会创建实例,显然饿汉式运行会比懒汉式的时间更长,但是占用的内存更大,简而言之,饿汉式空间换时间,而懒汉式是时间换空间。
另外重要的一点是饿汉式是线程安全的,而懒汉式是线程不安全的,这点在下面还会介绍