设计模式之单例模式

912 阅读2分钟

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

类型:创建类模式

在实际编程中,我们常常需要在运行过程中只创建一个对象,在执行过程中仅对这个对象进行操作,比如对数据库的连接类,我们并不希望每次操作数据库的时候都连接数据库,每次都产生一个数据库连接对象,我们希望在第一次连接数据库的时候创建该对象,而以后在每次操作中使用先前已经创建好的对象,可以理解为全局访问。

类图表示:

单例类拥有以下几个要素:

  • 私有构造方法(保证客户端无法去实例化该对象)
  • 指向自己实例的私有静态引用
  • 以自己实例为返回值得静态的共有的方法

单例模式根据实例化对象的时机不同分为两种方式:

饿汉式单例:单例类在被编译加载时候,就实例化一个对象交给自己的引用

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return singleton;
    }
}

懒汉式单例:在第一次调用实例方法的时候才会实例化对象

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式单例在单线程中表现的很好,但是如果在多线程并发的环境中就不敢保证了,所以如果需要使用懒汉式单例模式的话最好加个锁,避免并发带来的错误,保证线程安全。

public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if(instance == null) {
            synchronized(Singleton.class) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

使用场景:

  • 需要频繁实例化然后销毁的对象
  • 创建对象时耗时或者耗费资源过多,但又经常使用的对象
  • 频繁访问数据库或者文件的对象
  • 要求只能存在一个对象

单例模式的优点:

  1. 在内存中只有一个对象,节省内存空间
  2. 避免频繁地创建销毁对象,可以提高性能
  3. 避免对共享资源的多重占用
  4. 可以全局访问