单例模式的两种形式:
一、懒汉模式
//懒汉模式 public class SingletoDemo { //使用静态的类实例并赋值为空 private static SingletoDemo instance = null; //定义无参构造器 private SingletoDemo() { } //使用静态的 同步的 返回单例实例 的获取单例方法 public static synchronized SingletoDemo getInstance() { //判断实例是否为空,为空则返回实例,否则new 一个实例返回 if (instance == null) { instance = new SingletoDemo(); } return instance; } }
二、饿汉模式
//饿汉模式 public class SingletonDemo2 { //实例化静态的全局变量对象。 private static SingletonDemo2 instance = new SingletonDemo2(); //定义私有化无参构造器(只允许自己实例化自己) private SingletonDemo2(){} //给外部的类调用的接口:synchronized 绑定同步(使得只有一个类在同一个时间点访问该方法 //使得保证实例只有一个 public static synchronized SingletonDemo2 getInstance(){ return instance; } }
需要注意的地方:定义一个私有成员变量,需要私有静态的,还有需要定义私有的无参构造器,避免外部new自身,从而保证自身只有一个实例化对象。定义一个外部访问的接口,需要私有静态的,加上同步锁(使得在同一个时间点内实例只有一个进程可以使用)。
懒汉模式和饿汉模式到底在什么时候new对象?
个人的记忆方法为:
懒汉模式:懒得new,在需要的时候才实例化对象,
而饿汉模式,是提前new 好对象,需要的时候直接调用,