单例模式(Singleton Pattern),又称单体模式,解决的问题是保证一个类在内存中对象的唯一性(类只有一个实例)。
定义
将类的责任集中到唯一的单体对象中,确保该类只有一个实例,并且为该类提供一个全局访问点。(难点不在单体模式的实现,在于系统中任何识别单体和保证单体的唯一性)
单例模式如何保证对象的唯一性?
- 不允许其他程序用new创建该对象。
- 在该类中创建一个本类实例。
- 对外提供一个方法让其他程序获取该对象。
单例模式保证对象唯一性的步骤?(和上面对应)
- 私有化构造函数。private Singleton(){—}。如果不把构造器声明为private或protected,编译器会自动创建一个public的构造函数。
- 使用静态域(static)来维护实例。将单体对象作为单体类的静态域实例化,其类型就是单例类型本身。private static Singleton s = null; 如果不想其被重载,加上final。
- 使用静态方法监视实例的创建(分为饿汉式和懒汉式)。
// 饿汉式:
public class Singleton {
private final static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return s;
}
}
//懒汉式
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
return instance;
}
}
第一种叫饿汉式,开发时使用比较多,类一创建,对象就创建。这种方式浪费了内存。(内存中有静态区和非静态区)
第二种类加载时没有对象,只有调用了getInstance()方法时才会创建对象,此时创建的也是普通的实例,注意对比着看,这种事延迟加载,节省内存,但是在多线程并发访问时,可能保证不了对象的唯一性。