首页 > 代码库 > 基础知识(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) -- 单例模式