一、定义: 顾名思义,单例单例,也就是只允许有一个实例对象。
那怎么去控制只允许有一个实例对象呢?答案就是将其构造函数私有化(private),使外界不能去new这个类的对象。外界想要获取该类的对象,只能通过该类的静态方法去获取,从而达到控制只有一个实例的目的。
二、单例模式的实现
实现单例的方式有两种:
1.懒汉模式
2.饿汉模式
那什么叫懒汉模式、什么叫饿汉模式呢?顾名思义,懒汉就是我要的时候你才去做(太懒了),饿汉就是一上来就抢下“馒头”(即 一上来就把对象给new 好)。
下面我们来看看代码:
/*
* 懒汉模式 非线程安全
*/
class SingleLZ {
private static SingleLZ singleLZ;
private SingleLZ() {
}
public static SingleLZ getIntenceLz() {
if (singleLZ == null) {
return new SingleLZ();
} else {
return singleLZ;
}
}
}
// 懒汉式 线程安全
class SingleLZY {
private static SingleLZY singleLZY;
private SingleLZY() {
}
public static SingleLZY getIntenceLz() {
if (singleLZY == null) {
synchronized (SingleLZY.class) {
if (singleLZY == null) {
singleLZY = new SingleLZY();
}
return singleLZY;
}
}
return singleLZY;
}
}
/*
* 饿汉模式 线程安全
*/
class SingleHanger {
private static SingleHanger singleHanger = new SingleHanger();
private SingleHanger() {
}
public static SingleHanger getIntenceHanger() {
return singleHanger;
}
}
由上我们可以看出懒汉式的优点是没有的话才去new,比较节省内存,但是缺点是必须得给创建对象的地方加锁,才能保证在多线程的情况下才是安全的,所以在效率上就没有饿汉那么高,因为饿汉式是类加载之后就进行了对象的创建,且天生线程安全。只是一来就new,相对懒汉式来说,就比较占用内存。各有优缺点。但在开发中一般使用饿汉式,因为效率高且天生线程安全嘛。