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语句的判断会出现问题.

 

posted @ 2021-07-21 09:49  墨衣i  阅读(50)  评论(0)    收藏  举报