熟悉并且掌握单例模式中的懒汉模式

目录

前言

一、如何使用户只能实例化一个对象?

1:创建对象的理解

2:如何使用户创建一个对象?

 3:解决间接方法创建对象的问题

二:总结


前言

学习单例模式,首先要明白①什么是单例模式?单例模式顾名思义是为了只让用户实例化一个对象,那么问题来到②如何才能让用户创建一个对象呢?

一、如何使用户只能实例化一个对象?

如果是普通的类 让用户创建对象  用户只需要 

类名  对象名=new 对象();

一直new对象就可以无限的创建对象 这明显是多例模式 与我们的目的恰好相反

此时我们应该想到一个关键字private 

private:正如我们知道的private关键字的作用是为了收回用户的权利,我们如果使用private修饰属性,则用户不能直接通过 对象.属性 来更改属性  那么只要类比一下,如果将类中的构造函数私有化用户岂不是不能直接创建对象了么。

这时候有人会问,为什么要封装构造方法?其实这并不是上帝视角,只要想清楚创建对象的过程就很清晰。

1:创建对象的理解

        我们知道创建对象是        类名 对象名=new 类名();

真正创建对象的是new 类名();  类名();其实就是调用的构造方法,new 类名()得到的其实是堆内存的一块地址,将地址传给了对象名。所以只要我们将构造器封装一下,用户不就不能创建对象了么!!但是问题又来到了怎么让对象创建一个对象?

public class sluggard {

    private sluggard(){

    }

}

2:如何使用户创建一个对象?

      我们首先联想到private如果修饰属性,属性只能通过set,get方法来进行间接的赋值,取值,那么我们也可以使用一个间接的方法来创建对象啊!  于是我们想到了这样写

public class sluggard {

   private sluggard(){

    }

    public  sluggard getsluggard(){
         return new sluggard();
    }
}

       但是这样写其实又会出现问题  ,用户是无法调用这个方法的!怎么办?如何让用户可以调用间接的方法?正常我们封装属性,是可以通过调用对象.set/get来控制属性,但是现在根本无法创建对象如何调用方法?我们应该去想static关键字,通过这个关键字我们可以类名.方法名来调用!离成功又近了一步。但是又有了一个问题!

        只要用户不停的调用这个方法那不就可以创建无数个对象了么?

        如何解决这个问题呢?

 3:解决间接方法创建对象的问题

        我们再思考一下 ,我们如何让一个值在全局使用?成员变量是个不错的选择。并且,类修饰的变量都是引用型数据类型默认值是null那么就有了这样的想法

public class sluggard {

    private static sluggard ls;

    private sluggard(){

    }

    public static sluggard getsluggard(){
        if (ls==null){
            ls=new sluggard();
        }
        return ls;
    }
}

有的小伙伴会问,为什么ls要用static修饰   因为你想在static修饰的方法来用ls判断,静态方法里面只能用static类型的变量!不懂得要复习static关键字了。


二:总结

        我们在思考问题的时候其实应该去想一想,它是什么,跟以前学过的有什么联系,区别,如何实现它,一步一步的分析,过去在学习的时候,只想着结果是什么,没有分析的能力,做起来其实很困难,但现在我发现慢慢分析,将问题拆分,其实可以大大的提高你的学习效率。

        其实单例模式是对private以及static的进一步理解,单例模式不仅仅有懒汉模式,还有饿汉模式,具体的饿汉模式会尽快写出相应文章,第一次创作,可能排版,语言有些问题,慢慢改正吧,这种在博客上的记录自己学过的内容 也会间接提升自己的思维,感觉大家都可以试一试

        因为我也是刚刚开始从头学习的java,以后也会断断续续的分享一下自己的学习内容,大家一起加油吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值