本篇内容介绍了“java单例模式的详细讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
<强> java单例模式强>
<强>饿汉式单例强>
对于饿汉模式,我们可这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。
<强>懒汉式单例类强>
对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。
单例设计模式常用于JDBC链接数据库
<强>注意:强>
1我们常用的是第一种饿汉式,因为:
,(1)既然采用了单例设计模式,就是为了使用单例类的对象,所以就先把他实例化出来。
,(2)在懒汉式中存在一定的安全隐患,需要加上同步关键字同步,否则就谈不上单例了,但是加上了同步效率就稍逊了
2在第一种办法中,代码私有静态最后一单=新单();为什么有最后呢?
因为被最后一关键字修饰的类,不能被继承,最后被修饰的成员变量不可以被修改。
此处用了最后为了强化和重点突出:“同一对象,这个概念,只有这么一个对象,而且它是不可以被修改的。
如果不用最后修饰单一单那么就会有这么一种情况:业务很复杂,在不经意间就修改了此对象,造成各种错误。
<强>第一种(饿汉式):强>
思路:
(1)不让其他类建立该类的对象。即将构造函数设置为私有!
(2)自定义一个本类对象
(3)将自定义的对象提供出去。即定义一个得到方法,返回值为此类的对象。
,分析:
,第一步:将单例类中构造函数私有化了且利用一个得到()函数向外提供此类的对象,所以其他类无法构造此类的对象。
,第二步:但其他类要想调用此单例类里的方法,于是只有采用内名。方法名()来实现,这就要求这个方法必须是静态静态的。
,第三步:又因为静态方法只能访问静态成员!所以要将单设置为静态的
public class SingleDemo {, public 才能;static  void main (String [], args), {, ,,,,Single s1=Single.getSingle (),, ,,,,s1.setNumber (44),, ,,,,Single s2=Single.getSingle (),, ,,,,s2.setNumber (55),, ,,,,System.out.println (“s1.number=? s1.number),, ,,,,System.out.println (“s2.number=? s2.number),, ,,,,如果(s1.equals (s2)) {, ,,,,,,,System.out.println (“s1与s2是同一对象即:s1==s2");//如果条件成立, ,,,,,,}, ,,}, }, , , 单{class ,,int 数量; public 才能;int  getNumber (), {, ,,,,,,return ;数量, ,,,,}, public 才能;void  setNumber (int 编号),{, ,,,,,,this.number =,数量,, ,,,,}, private 才能;单(){},//第一步, private 才能static final  Single 单=new 单();//第三步, public 才能static Single  getSingle(){//第一步和第二步, ,,,,,,return 单身,, ,,}, }
<强>第二种(懒汉式):强>
package cn.com,, {public class  SingleDemo2 ,,public static  void main (String [], args), {, ,,,,,Single s1=Single.getSingle (),, ,,,,,s1.setNumber (44),, ,,,,,Single s2=Single.getSingle (),, ,,,,,s2.setNumber (55),, ,,,,,System.out.println (“s1.number=? s1.number),, ,,,,,System.out.println (“s2.number=? s2.number),, ,,,,,如果(s1.equals (s2)) {, ,,,,,,,System.out.println (“s1与s2是同一对象即:s1==s2");//如果条件成立, ,,,,,,}, ,,,,}, , , }, , , 单{class ,,int 数量, ,,public int  getNumber (), {, ,,,,,,return ;数量, ,,,,}, ,,public void  setNumber (int 编号),{, ,,,,,,this.number =,数量,, ,,,,}, ,,private 单(){},, ,,private static  Single 单=零;, ,,public static  synchronized Single getSingle(){//多线程时加上同步是关键! ! !, ,,,,,如果(单==null) {, ,,,,,,,,单=new 单(),, ,,,,,,,,return 单身,, ,,,,,,}, ,,,,,其他{, ,,,,,,,,return 单身,, ,,,,,,,}, ,,}, nulljava单例模式的详细讲解