首页 > 代码库 > 基础知识(02) -- 单例模式
基础知识(02) -- 单例模式
单例模式
1.基本概念
2.单例模式的定义
3.单例模式中的角色
4.单例模式延迟加载
5.单例模式中使用静态内部类解决"懒汉式"和"饿汉式"带来的问题
6.什么是类级内部类
----------------------------------------------------------------
1.基本概念:
单例模式是设计模式中使用最普遍的模式了,它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。
使用单例模式可以带来两大好处:
1.对于频繁使用的对象,可以省略创建对象所花费的时间
2.由于new操作的次数减少,因而对系统内存的使用率也就降低了,这将减轻GC压力,缩短GC停顿时间
2.单例模式的定义:
保证一个类仅有一个实例,并提供一个访问它的全局访问点
3.单例模式中的角色:
单例类: 提供单例的工厂,返回单例
使用类: 获取并使用单例类
下面代码是一个最简单的单例模式:
1 /** 2 * 演示最简单的单例模式(下面的写法在多线程环境下会有问题) 3 */ 4 public class Singleton { 5 private static Singleton instance = new Singleton(); 6 7 private Singleton(){ 8 System.out.println("Singleton is create"); 9 } 10 11 public static Singleton getInstance(){ 12 return instance; 13 } 14 }
单例模式的核心在于通过一个接口返回唯一的对象实例
注意上面代码中加粗的部分:
1.单例类必须要有一个private访问级别的构造函数
2.instance成员变量和getInstance()方法必须是static的
4.单例模式中的延迟加载
先看看代码:
/** * 演示单例模式中的延迟加载 * @author Administrator * */ public class LazySingleton { private static LazySingleton instance = null; private LazySingleton(){ System.out.println("LazySingleton is create!"); } private static synchronized LazySingleton getInstance(){ if(instance == null){ instance = new LazySingleton(); } return instance; } }
上面单例模式的代码实现中,虽然实现了延迟加载的功能,但却引入了同步关键之synchronized,因此在多线程环境中它的耗时会比较多。
5.单例模式中使用静态内部类解决"懒汉式"和"饿汉式"带来的问题
先看代码:
1 public class StaticSingleton { 2 3 private StaticSingleton(){ 4 System.out.println("StaticSingleton is create"); 5 } 6 //静态内部类 7 private static class SingletonHoler{ 8 private static StaticSingleton instance = new StaticSingleton(); 9 } 10 11 public static StaticSingleton getInstance(){ 12 return SingletonHoler.instance; 13 } 14 }
在上面的实现中,单例模式使用内部类来维护单例的实例,当StaticSingleton被加载时,其内部类并不会实例化,故可以确保StaticSingleton类被载入JVM时,不会初始化单例类,而当调用getInstance()方法 时,才会加载SingletonHoler,从而初始化instance,同时,由于实例的创建是在类加载时完成的,所以由JVM来保证多线程下的安全性,所以getInstance()方法也不需要使用同步关键字。
6.什么是类级内部类
简单点说,类级内部类指的是: 有static修饰的成员式内部类。如果没有static修饰的成员式内部类被称为对象级内部类。
类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可直接创建。而对象级内部类的实例,是绑定在外部对象实例中的。
类级内部类中,可以定义静态的方法。在静态方法中只能引用外部类中的静态成员方法或成员变量。
类级内部类相当于其外部类的成员,只有在第一次被使用的时候才会被装载。
基础知识(02) -- 单例模式