单例模式: 内存中只存在一份该类的实例对象, 分为懒汉式和饿汉式单例模式。
开发中:建议使用饿汉式单例模式 (例如JDK中的Runtime类),因为饿汉式不存在线程安全问题。
面试中:建议谈谈懒汉式单例模式,因为其中会涉及延迟加载的思想和线程安全的问题,技术含量高点。
package ms.gaoke.pattern;
/* 1: 饿汉式 单例模式
* 1. 构造方法私有化, 阻止其他类创建实例对象
* 2. 对外提供通过类名调用的实例方法(getInstance方法), 需用static关键字修饰
* 3. 创建static成员变量,并使用private修饰,避免外部类通过类名来修改成员变量
*
*/
public class SingletonPerson1 {
private static SingletonPerson1 person1 = new SingletonPerson1();
private SingletonPerson1() {}
public static SingletonPerson1 getInstance() {
return person1;
}
}
package ms.gaoke.pattern;
/* 2: 懒汉式 单例模式
* 1. 延迟加载的思想
* 2. 需要处理线程安全问题
*
*PS:线程安全需要考虑以下三点:
* 1.是否多线程环境下
* 2.是否存在共享数据
* 3.是否是原子性的操作共享数据
*
*/
public class SingletonPerson2 {
private static SingletonPerson2 person2 = null;
private SingletonPerson2() {}
public synchronized static SingletonPerson2 getInstance() {
if(person2 == null) {
person2 = new SingletonPerson2();
}
return person2;
}
}