单例模式最简单详解
Java创建对象有四种方式:
(1)用new 语句创建对象(2)反射(3)调用对象的clone()方法(4)反序列化
最常用的无疑是new方法。而new方法实质是通过调用对象类的构造方法来实现对象的实例化。
话不多说,举两个例子,一个是普通模式创建实例,另一个则是单例模式创建实例。如果你每一行代码都认真看了,我不信你理解不了什么是单例模式。
1.普通模式下
public class General {
//普通模式,别的类可以任意地通过自己的构造函数创建实例
public General(){};
public General(int a){};
}
class test{
public static void main(String[]args){
//一般来说就是通过构造方法来创建实例的
//比如这个,通过调用General的无参构造,创建了一个General类型的实例general1
General general1 = new General();
//比如这个,通过调用Genera的有参构造,创建了一个General类型的实例general2
General general2 = new General(2);
}
}
2.单例模式下
public class Single {
//单例模式
// 把构造方法私有化,别的类无法通过调用自己的构造函数创建Single类型的实例
private Single(){};
//那如果别的类需要创建Single类型的实例怎么办呢?
//方法在下面↓
//先声明一个Single类型的变量,变量名为singleInstance,此时他的值为null
private static Single singleInstance;
//再创建一个方法。这个方法是给外面的类用的
public static Single getSingleInstance(){
//方法的内容是什么呢:
// 如果singleInstance的值为null,则自己在方法内创建一个自身类型(Single)的实例,return给外面的类
if(singleInstance == null){
singleInstance = new Single();
}
//如果singleInstance不是null,就直接return给外面那些调用他的类。
return singleInstance;
}
}
class test2{
public static void main(String[] args) {
//直接调用方法,就可以创建实例了。
Single singleInstance = Single.getSingleInstance();
}
}
3.懒汉模式和饿汉模式那点事
//饿汉模式
public class HungryMan {
private HungryMan(){};
private static HungryMan hungry = new HungryMan();
public static HungryMan getHungry(){
return hungry;
}
}
//懒汉模式纯净无注释版
class LazyMan {
private LazyMan(){};
private static LazyMan lazy;
public static LazyMan getLazy(){
if(lazy == null){
lazy = new LazyMan();
}
return lazy;
}
}
class HungryTest{
public static void main(String[] args) {
HungryMan.getHungry();
LazyMan.getLazy();
}
}
总结:
1.单例模式
只允许创建一个自己这种类型的实例。
因为普通模式下可以随意通过调用构造方法创建多种多个实例,所以单例模式就给构造方法隐藏了,不给别人用。
但是自身不能被实例化,那他的存在岂不是很没有意义,他也需要和外界交流。
所以,他就自己在自己内部的方法体内,创一个实例。别人要用的话,只能用这一个实例,想用别的没门。
饿汉模式和懒汉模式就是单例模式的两种情况。
2.饿汉与懒汉有啥不一样?
1)饿汉式:自身的实例对象老早就创建完成了(static)。你调用我的方法,我就直接给你个对象~~
2)懒汉式:自己一开始只是声明了个自身类型的变量名(上例中:private static Single singleInstance;)。你第一次调用我的方法时(singleInstance只是个Single类型的变量名,默认值为null),我创建个给你(此时,singleInstance = new Single();)。创建好啦,以后你无论再来找我多少次,我都不用在重新new对象了,直接把singleInstance给你。
为啥叫我懒汉,懂了吗?饿汉不管有没有人用,总是一开始就创建了自身实例,而我,你不用我,我就不创建!
我这只是让读者明白什么是单例,饿汉模式,懒汉模式。至于具体的不同之处,优缺点什么的,我不在赘述,CSDN上有很多。