java学习day16---(单例模式)
单例模式就是一个类只能实例一个对象
单例模式最重要的思路就是:在自己类的属性里加上自身类型的属性 这是语言设计者给到的思路(换我打死也不会想到在自己类里加自己的属性)
单例模式又分饿汉模式和懒汉模式
饿汉模式:
首先创建一个Dog类,有一个私有属性name,和无参构造、有参构造

1.一般的类在创建对象时,都需要调用构造函数.因此第一步我们就应该使这个类在别的类不能调用构造函数,这样就不能创建对象了
方法是把public改成private 这样在别的类中就不能调用构造函数,也就不能创建对象


2.既然在外部创建不了变量,那就可以写一个方法来创建一个变量,这时候就有一个问题,不能创建对象怎么调用方法?因此需要把这个方法设计成静态的


3.这时候使用者可以无限使用这个方法来创建对象,因此最重要的思路来了,就是在属性里加上自身类型的属性,并且直接调用构造函数创建对象

4.由于是私有属性,只能通过方法来获得,因此在getDog()方法中,可以直接返回这个属性:



这样单例类就实现了,在测试类中创建两个对象,测试一下:

结果:

地址一样,说明都是指向同一个内存!
分析一样原因:java进行类加载的时候,会最先加载静态修饰的属性和方法,因此private static Dog dog=new Dog(); 很早就被执行了,已经开辟好了空间
由于不能通过构造函数来创建对象,只能通过方法public static Dog getDog()来获得,这个方法返回值又是静态属性dog,静态的属性又是共有的,空间早
已开辟好地址已定死,无论调用public static Dog getDog()多少次,都只会返回同一个地址名,因此也就只能创建一个对象,实现了一个单例。
懒汉模式:
修改一下上面的代码:


饿汉模式和懒汉模式的区别在于:饿汉模式一开始就已经创建了一个对象了,只需要调用getDog()方法获得这个对象;懒汉模式需要用到对象时,才调用getDog()方法去创建对象并且获取
懒汉模式有一个弊端,在高并发时,if语句的判断会出现问题.

浙公网安备 33010602011771号