什么是单例模式?
单例模式是java中最简单的一种设计模式
需要注意的问题:
1.单例类有且只能有一个实例
2.单例类必须自己创建出这个实例,并提供给外界
那么如何自己创建实例而不让外界创建呢?很简单,我们将无参的构造函数定义为private即可
单例模式的优缺点
- 优点:单例类只有一个实例,从而能避免因为频繁创建和销毁所带来的内存消耗
- 缺点:与单一职责原则(一个类应该只关心内部逻辑,而不关心外面怎么样来实例化)冲突
简单实现
下面是一个最简单的单例类
public class SingleDemo {
//自己创建出实例
private static SingleDemo singleInstance = new SingleDemo();
//无参的构造方法定义为private,这样就不会被外界实例化
private SingleDemo(){}
//将单例提供给外界
public static SingleDemo getSingleInstance(){
return singleInstance;
}
public void hello(){
System.out.println("hello world");
}
}
我们在外界进行简单的调用
public class TestSingle {
public static void main(String[] args) {
SingleDemo singleInstance = SingleDemo.getSingleInstance();
singleInstance.hello();
}
}
如果我们在外界尝试进行实例化单例类会怎么样?
懒汉式
懒加载,线程不安全,当第一次用到这个对象时,才创建对象
/**
* 懒汉式的的简单实现
*/
public class SingleInstance {
private static SingleInstance singleInstance;
private SingleInstance(){}
private static SingleInstance getInstance(){
if (singleInstance == null){
singleInstance = new SingleInstance();
}
return singleInstance;
}
}
饿汉式
线程安全,在加载类时,就加载对象
/**
* 饿汉式的的简单实现
*/
public class SingleInstance {
private static SingleInstance singleInstance = new SingleInstance();
private SingleInstance(){}
private static SingleInstance getInstance(){
return singleInstance;
}
}
双重锁
懒加载,线程安全,且在多线程环境下性能高
/**
* 双重锁的的简单实现
*/
public class SingleInstance {
private static SingleInstance singleInstance;
private SingleInstance(){}
private static SingleInstance getInstance(){
if (singleInstance == null){
synchronized (SingleInstance.class){
if (singleInstance == null){
singleInstance = new SingleInstance();
}
}
}
return singleInstance;
}
}