目录
前言
学习单例模式,首先要明白①什么是单例模式?单例模式顾名思义是为了只让用户实例化一个对象,那么问题来到②如何才能让用户创建一个对象呢?
一、如何使用户只能实例化一个对象?
如果是普通的类 让用户创建对象 用户只需要
类名 对象名=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,以后也会断断续续的分享一下自己的学习内容,大家一起加油吧。