gpt4 book ai didi

图文结合讲解Java单例模式

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章图文结合讲解Java单例模式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

ps:首先我们要先知道什么是单例,为什么要用单例,用的好处是什么等问题来看.

1:java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例 。

单例模式有以下特点:

  1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例.

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个printer spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头.

2:懒汉式 。

先把单例类写出来 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class singletontest {
   //懒汉式单例类.在第一次调用的时候实例化自己 
   private singletontest() {}
     private static singletontest single= null ;
     //静态工厂方法 
     public static singletontest getinstance() {
        if (single == null ) { 
          single = new singletontest();
          system.out.println( "创建一次" );
       
       return single;
     }
     
     public void show(){
       system.out.println( "我是show" );
     }
 
}

这里直接上代码,代码中有详解 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class singletontest2 {
 
   public static void main(string[] args) {
     // todo auto-generated method stub
     //故意写获取两次,创建两个对象
     singletontest singleton=singletontest.getinstance();
     singletontest singleton2=singletontest.getinstance();
     
     //singleton对象只创建一次,但是写两次还是可以的,而且方法都是可以调用的,但是看下面
     singleton.show();
     singleton2.show();
     
     //两个对象的表现形式一样
     if (singleton == singleton2){
       system.out.println( "该对象的字符串表示形式:" );
       system.out.println( "singleton :" +singleton.tostring());
       system.out.println( "singleton2:" +singleton2.tostring());
     }

图文结合讲解Java单例模式

由上面的图可以看出就算多创建几个对象,在底部也是只有一个singleton对象实例,而且创建出来的对象的字符串表现形式也是一样的,有的人肯定有疑问,那平常两个对象是什么样子的呢,我下面给你解释说明,在这之前我写说一下这个懒汉式需要注意的地方,它是线程不安全的,并发环境下很可能出现多个singleton实例,有很多方法可以解决,比如说同步锁,静态内部类等,这里主要说静态内部类,这个比较好点, 。

?
1
2
3
4
5
6
7
8
9
10
public class singleton3 { 
   private static class singletonholder { 
     private static final singleton3 instance = new singleton3(); 
  
   private singleton3 (){} 
   public static final singleton3 getinstance() { 
     system.out.println( "singleton创建" );
     return singletonholder.instance; 
  

调用:

?
1
2
3
4
5
6
7
singleton3 singleton3=singleton3.getinstance();
     singleton3 singleton4=singleton3.getinstance();
     if (singleton3 == singleton4){
       system.out.println( "该对象的字符串表示形式:" );
       system.out.println( "singleton3:" +singleton3.tostring());
       system.out.println( "singleton4:" +singleton4.tostring());
     }

结果图:

图文结合讲解Java单例模式

这里我也是创建了两个对象来说明,神奇的是打印了两次singleton创建,这难道是又创建成功了的对象吗?答案是:虽然打印了两次,对象名也有两个,但是该对象的字符串表示形式还是一样的,而且大家都知道static的用法,就是在类被加载的同时该singleton对象就已经被创建,后期不会再被创建,就算后期自己又调用了getinstance()方法,但底层还是公用的一个singleton对象. 。

同样,我写了一个普通的类,来同时创建两个对象,并且打印他们的tostring()方法,如下:

?
1
2
3
4
5
6
7
8
9
10
11
qubie qb1= new qubie();
     qubie qb2= new qubie();
     if (qb1 == qb2){
       system.out.println( "该对象的字符串表示形式:" );
       system.out.println( "singleton3:" +qb1.tostring());
       system.out.println( "singleton4:" +qb2.tostring());
     } else {
       system.out.println( "该对象的字符串表示形式:" );
       system.out.println( "singleton3:" +qb1.tostring());
       system.out.println( "singleton4:" +qb2.tostring());
     }

图文结合讲解Java单例模式

由此可看出来对象的字符串表示形式是不一样的 。

3:饿汉式单例 。

饿汉式单例类.在类初始化时,已经自行实例化   。

?
1
2
3
4
5
6
7
8
public class singleton1 {
  private singleton1() {}
  private static final singleton1 single = new singleton1();
  //静态工厂方法 
  public static singleton1 getinstance() {
    return single;
  }
}

因为这本身就是static修饰的方法,所以是在类加载的时候被创建,后期不会再改变,所以线程是安全的.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:http://blog.csdn.net/jjhahage/article/details/78277105 。

最后此篇关于图文结合讲解Java单例模式的文章就讲到这里了,如果你想了解更多关于图文结合讲解Java单例模式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com