单例设计模式

一、单例设计模式三部件

【】设计模式:设计方面的统一规范。模式,就是统一规范。

四个程序员总结过往项目,总结出了23种设计模式。设计模式,就是问题的解决方案。

比如吃饭,现在积累下来解决方案有筷子,勺子,刀叉,手;

 

图片

 

【】本课程讲解单例设计模式,

单例,单一实例,内存中只有这个类的一个对象。

【】比如,要实现对象信息的共享,就只能有一个对象,a程序对对象信息进行改变b程序也能知道、

最简单办法就是把对象静态化,但是静态生命周期长。

一些牛人提出了解决方案。

图片

 【】单例模式:该类本类中进行

1私有化该类构造函数,则使外界无法创建该类对象。

2该类里面创建一个本类对象,并对外提供获取这一个对象的方法。

(因为外界无法new出该类对象,只能通过类名调用,所以这个获取方法需要加共享static,,静态只能调用静态没所以里面s也需要加static;

创建的本类对象s属于成员变量,为了可控,一般私有化处理。这样避免了外界直接访问成员变量)

图片

 

 【】在一个普通类中,添加这单例模式三项:构造器私有,创建本类对象并提供对外获取该对象方法。

就能实现单例模式。

 
 二、单例设计模式图解

【】关键在于jvm见到类名就将该类加载进入内存方法区,其中方法也会执行,在堆内存创建出一个对象。

图片

 

 

【】主函数main进栈,变量s1在主函数内开辟空间

【】右侧single类名执行,首先类进入内存。

构造函数single(){},作为非静态,进入方法区的非静态区,持有this

共享的成员变量s进入方法区的共享区,初始化为null。共享的方法getinstance(){}也进入静态区。

(成员变量共享的进入共享区,不共享的对象特有成员需要在堆内存建立对象才能使用)

【】s右侧在堆内存建立对象,有了受内存地址0045

【】之后这个地址赋值给方法区的静态区的s,s=0045,s指向对象。

 

【】此时类名single执行完,类名single再调用函数getlnstance()。

函数getinstance()进栈,进站后执行方法区的代码,将静态区s=0045赋值给main方法中变量s1,s1=0045

执行完,getinstance()函数弹栈

 

【】第二句,s2在mian开辟空间,右侧类名调用函数getinstance()进栈,

进栈后执行方法区的代码,将静态区s=0045赋值给main方法中变量s2,s2=0045,

执行完,getinstance()函数弹栈

 
 

 三

 【】单例的两种表现形式:

【】上文的三步:私有化构造器,类中创建本类对象并提供获取本类对象的方法

这种,属于一开始就把本类对象创建完成。类一加载,本类对象就创建有了。叫做饿汉式,饿的先创建对象再说。

图片

 

 【】另一种:私有化构造器,先准备本类对象的引用,在对外提供获取对象方法里面创建本类对象

这种调用方法时,才建立本类对象。用的时候才创建本类对象。很懒惰。

图片

【】面试时,考察单例的延迟加载形式比较多

【】真的开发的时候,用第一种做法,因为用单例就意味着要创建对象,不如早早创建完拉到。

【】其次,延迟加载形式在多线程时会出现问题,无法保证对象的唯一性

 

 总结:

单例设计模式两种:

一、直接加载形式

三步骤:

私有化构造器(保证外界无法new出多个对象)

本类中建立本类对象并私有化(这个对象就是唯一对象)-----类一加载进入内存,这个对象就创建完了

提供获取类中本类对象的方法(通过类名获取这个对象,这种类名获取的对象就是唯一对象)

二、延迟加载形式

私有化构造器

先提供类中本类对象的变量名值为空

提供获取类中本类对象的方法中建立本类对象(调用这个函数时,对象才创建,用到时才创建对象)

 
posted @ 2025-08-30 15:39  ibddindonon  阅读(9)  评论(0)    收藏  举报