单例模式-饿汉模式-懒汉模式的理解

单例模式最简单详解

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上有很多。

有不对之处,请指出,感恩。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值