单利设计模式
- 特点:
单利设计模式设计的类有且只有一个实例对象
- 使用场景
单例设计模式只应在有真正的“单一实例”的需求时才可使用。
- 设计步骤
- 私有化构造方法,有几个构造方法就私有化几个,保证其他地方不能实例化本类对象。
- 本类中创建一个本类的实例化对象。
- 提供一个能够返回本类对象的方法。
- 设计方法
- 饿汉式:在创建类属性时,创建一个本类对象引用并直接new出对象。(加载本类时就创建对象)
- 懒汉式:在返回本类对象的方法中创建对象。(需要时调用方法再创建对象)
- 代码
- 饿汉式:
/**
* 饿汉式
*/
public class Simple {
//1.将构造方法私有化(保证其他地方不能创建本类对象)
private Simple(){}
//2.创建一个成员变量
private static Simple simple = new Simple();
//3.提供一个返回本类实例对象的方法
public static Simple getInstanceSimple(){
return simple;
}
}
饿汉式设计出的类是线程同步(线程安全)的。
2.懒汉式:
/**
* 懒汉式
*/
public class Simple {
//1.将构造方法私有化(保证其他地方不能创建本类对象)
private Simple(){}
//2.创建一个成员变量
private static Simple simple;
//3.提供一个返回本类实例对象的方法
public static Simple getInstanceSimple(){
//判断当前是否已经存在一个本类实例对象 如果存在就不创建
if(simple == null){
simple = new Simple();
}
return simple;
}
}
懒汉式设计的类是线程不同步的(线程不安全),如果同时有多个线程访问本类,有可能导致本类实例不唯一。
为了解决这种问题,融入多线程编程,下面来看一下多线程下的单利设计模式:
/**
* 多线程下的单例模式(懒汉式)
*/
public class Simple {
private static Simple simple = null;
private Simple() {}
public static Simple getInstance() {
// 多加一次判断,是为了解决效率问题
if (simple == null) {
// 加个同步锁 是为了解决安全问题(不管有多少线程同时访问,只会存在一个实例)
synchronized (Simple.class) {
if (simple == null) {
simple = new Simple();
}
}
}
return simple;
}
}
- 总结
饿汉式:在创建类属性时就创建了本类对象,线程安全。
懒汉式:需要得到单利对象时再创建对象,线程不安全,需要结合多线程设计。