单例设计模式
| 一、单例设计模式三部件 |
|
【】设计模式:设计方面的统一规范。模式,就是统一规范。 四个程序员总结过往项目,总结出了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出多个对象) 本类中建立本类对象并私有化(这个对象就是唯一对象)-----类一加载进入内存,这个对象就创建完了 提供获取类中本类对象的方法(通过类名获取这个对象,这种类名获取的对象就是唯一对象) 二、延迟加载形式 私有化构造器 先提供类中本类对象的变量名值为空 提供获取类中本类对象的方法中建立本类对象(调用这个函数时,对象才创建,用到时才创建对象) |







浙公网安备 33010602011771号