java单例模式的详细讲解

  介绍

本篇内容介绍了“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 单身,,   ,,,,,,,},   ,,},   null

java单例模式的详细讲解