单例设计模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,一个类只有一个对象。单例也分为两种单例,一种是饿汗式单例,一种是懒汉式单例,实现步骤如下
1. 私有构造器
2.创建一个私有的静态类属性
3.创建一个静态方法, 方法返回静态类属性
饿汗式单例
立即加载,就是当你当你使用这个类的时候这个类已经创建好了,反正会提前你一步把这个类创建出来,不管你有没有使用! 缺点就是如果你不使用这个类的话那就白创建了这个类了,浪费内存存储他, 优点就是当你要使用它的时候,他已经给你创建好了,不需要你花时间等待他创建!
public final class Single {
// 直接创建出了这个对象
private final static Single single = new Single();
// 私有构造器,保证不能有第二个对象出来
private Single(){}
// 一个公开方法专门返回该对象出去
public final static Single getInstance(){
return single;
}
}
懒汉式单例
懒汉式单例就是等你需要调用到这个对象的时候他才给你创建,优点是需要的时候才创建,不需要的时候不会创建出来,相比饿汗式单例就是给你省了一点内存,缺点是你需要的时候才给你创建,需要你等待他创建出来你才能调用,下面的代码只适合单线程程序使用,如果多线程的话会出现一个问题,那就是几个线程同时调用这个方法,然后发现对象是null,就会创建多个对象出来
public final class Single {
private static Single single;
// 私有构造器,保证不能有第二个对象出来
private Single() {
}
// 一个公开方法专门返回该对象出去
public final static Single getInstance() {
if (single == null) {
single=new Single();
}
return single;
}
}
多线程的写法就是加上线程安全关键字,如下
public final class Single {
private static Single single;
private Single() {}
public final static Single getInstance() throws InterruptedException {
// 第一次检查instance是否被实例化出来
if (single == null) {
synchronized (Single.class){
// 第二次检测,要不然还是会new出多个对象出来
if(single == null){
single=new Single();
}
}
}
return single;
}
}