`

JDK设计模式应用——单例模式(Singleton)(转)

阅读更多

JDK设计模式应用——单例模式(Singleton)

    《JDK源码分析》的分支,讲解设计模式在jdk中使用。

   我们从三个方面讲述,一是:jdk源码中的设计模式;二是:讲解设计模式(UML图);三是:实现我们自己的设计模式代码。今天带来最简单的设计模式——单例模式(Singleton)

 

一、jdk源码中的设计模式

 

   我们先看java.lang包下的class Runtime

Java代码  收藏代码
  1. public class Runtime {  
  2.   
  3.     private Runtime() {}//私有的构造方法  
  4.   
  5.     //Runtime类的私有静态实例  
  6.     private static Runtime currentRuntime = new Runtime();  
  7.   
  8.     //获得静态实例的唯一方法  
  9.     public static Runtime getRuntime() {  
  10.         return currentRuntime;  
  11.     }  
  12.   
  13. }  

    解释:

   (1)存在私有的构造函数,不能通过new来得到类的实例。

   (2)私有的静态实例,一个class只能对应唯一的对象。

   (3)只能通过:类.get方法获得这个唯一的对象实例。

 

     我们可以通过如下代码验证

Java代码  收藏代码
  1. Runtime r1 = Runtime.getRuntime();  
  2. Runtime r2 = Runtime.getRuntime();  
  3. //“==”为地址判断,为true表示:r1与r2指向同一对象。  
  4. System.out.println(r1 == r2);  

   结果显然为:true

 

 

二、讲解设计模式(UML图)

 

                     

   上面是Singleton的UML图

   单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。(来源——百度百科)

   单例模式的思想使用在很多方面,比如:一台计算机可以有若干打印机,但是一个时间只能有一个Printer Spooler,避免两个文件同时输入到打印机中。

   单例模式满足三个条件:

   (1)某个类只能有一个实例。

   (2)类必须自行创建这个类的实例(创建静态成员变量或者在类的静态方法中生成实例)。

   (3)类必须自行向整个系统提供这个实例。

 

 

 三、实现我们自己的设计模式

 

    我们实现单例模式分为两种:1、静态成员变量  2、静态方法(有人成为饿汉式和懒汉式)

   1、静态成员变量

Java代码  收藏代码
  1. public class SingletonTest  
  2. {  
  3.         //在类里面实例化静态成员变量  
  4.     private static SingletonTest singletonTest = new SingletonTest();  
  5.   
  6.     private SingletonTest()  
  7.     {  
  8.     }  
  9.   
  10.     public static SingletonTest getInstance()  
  11.     {  
  12.         return singletonTest;  
  13.     }  
  14. }  

 

 2、静态方法(最常用的方法)

Java代码  收藏代码
  1. public class SingletonTest  
  2. {  
  3.     private static SingletonTest singletonTest = null;  
  4.   
  5.     private SingletonTest()  
  6.     {  
  7.     }  
  8.   
  9.     public static SingletonTest getInstance()  
  10.     {  
  11.         //在类的静态方法中实例化单例  
  12.         if (null == singletonTest)  
  13.         {  
  14.             singletonTest = new SingletonTest();  
  15.         }  
  16.   
  17.         return singletonTest;  
  18.     }  
  19. }  

 

3、第二种方法构建单例模式是最常用的,但是在并发程序中会导致单例模式失效。

   如下面的代码所示:

Java代码  收藏代码
  1. public class SingletonTest  
  2. {  
  3.     private static SingletonTest singletonTest = null;  
  4.   
  5.     private SingletonTest()  
  6.     {  
  7.     }  
  8.   
  9.     public static SingletonTest getInstance()  
  10.     {  
  11.         if (null == singletonTest)  
  12.         {  
  13.             try  
  14.             {  
  15.                 Thread.sleep((long) (Math.random() * 4000));  
  16.             } catch (InterruptedException e)  
  17.             {  
  18.                 // TODO Auto-generated catch block  
  19.                 e.printStackTrace();  
  20.             }  
  21.             singletonTest = new SingletonTest();  
  22.         }  
  23.   
  24.         return singletonTest;  
  25.     }  
  26.   
  27.     public static void main(String[] args)  
  28.     {  
  29.         // 打印出两个对象  
  30.         new ThreadTest().start();  
  31.         new ThreadTest().start();  
  32.     }  
  33. }  
  34.   
  35. class ThreadTest extends Thread  
  36. {  
  37.     @Override  
  38.     public void run()  
  39.     {  
  40.         System.out.println(SingletonTest.getInstance());  
  41.     }  
  42. }  

   输出的结果是:不是同一个对象,单例模式失效了。

Java代码  收藏代码
  1. com.shy.test.SingletonTest@55fe910c  
  2. com.shy.test.SingletonTest@3be4d6ef  

   对于单例模式(Singleton)来说,如果在 getInstance()方法中生成 Singleton 实例则可能会产生同步问题,即可能会生成两个不同的对象。

 

  解释:

   当两个线程同时执行到getInstance()方法时,此时singletonTest为null,两个线程都会分别实例化出一个对象,因此出现了两个对象。

  解决方法:(使用synchronized解决同步问题)

Java代码  收藏代码
  1. public class SingletonTest  
  2. {  
  3.     private static SingletonTest singletonTest = null;  
  4.     private SingletonTest()  
  5.     {  
  6.     }  
  7.     public static SingletonTest getInstance()  
  8.     {  
  9.         if (null == singletonTest)  
  10.         {  
  11.             synchronized (SingletonTest.class)  
  12.             {  
  13.                 singletonTest = new SingletonTest();  
  14.             }  
  15.         }  
  16.         return singletonTest;  
  17.     }  
  18. }  

总结:Java中单例模式(Singleton Pattern)定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”

转自:http://770736680.iteye.com/blog/2035740

分享到:
评论

相关推荐

    JAVA设计模式在JDK中的应用

    ### JAVA设计模式在JDK中的应用 #### 一、引言 在软件开发过程中,设计模式作为一套被广泛接受的解决方案,能够帮助开发者解决常见的设计问题。Java作为一门流行的编程语言,其标准库(JDK)中巧妙地融入了多种设计...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...

    单例模式 Singleton Pattern

    ### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...

    Java JDK 6学习笔记——ppt简体版.rar

    Java JDK 6是Java开发工具集的一个重要版本,它包含了编译器、JVM(Java虚拟机)、调试器和其他用于开发和运行Java应用程序的工具。这份"Java JDK 6学习笔记——ppt简体版"提供了关于这个关键版本的详细教程,适合...

    Java JDK 6学习笔记——ppt简体版附课本代码

    Java JDK 6是Java开发工具集的一个重要版本,它为开发者提供了广泛的编程工具和技术支持,使得Java应用程序的开发和运行更加高效。这份“Java JDK 6学习笔记——ppt简体版”涵盖了Java语言的核心概念、语法特性以及...

    linux安装jdk(csdn)————程序.pdf

    正确安装JDK对于Java应用程序的运行至关重要。本文将指导您如何在Linux系统上安装JDK。 一、解压JDK 安装JDK的第一步是解压缩JDK安装包。通常,JDK安装包是一个tar.gz文件,可以使用tar命令来解压缩。例如,如果...

    设计模式实现——代理模式

    **设计模式实现——代理模式** 在软件工程中,设计模式是一种通用可重用的解决方案,它描述了在特定上下文中经常出现的问题以及该问题的解决方案。代理模式是设计模式的一种,它提供了一种对目标对象的间接访问方式...

    Java JDK 6学习笔记——ppt简体版 第20章.ppt

    Java JDK 6学习笔记——ppt简体版 第20章.ppt

    Java JDK 6学习笔记——ppt简体版 第19章.ppt

    Java JDK 6学习笔记——ppt简体版 第19章.ppt

    Java JDK 6学习笔记——ppt简体版 第18章.ppt

    Java JDK 6学习笔记——ppt简体版 第18章.ppt

    [创建型模式] head first 设计模式之单件模式(Singleton)

    **单例模式(Singleton)**是软件设计模式中的一种创建型模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,例如管理共享资源、配置对象或者数据库连接等。单例...

    设计模式在JDK的中的应用,PPT资源

    设计模式在JDK中的应用课设--PPT资源 题目要求: 设计模式在JDK中的应用(结合JDK源码,分析JDK对设计模式的支持与应用)。课设内容包括: (a)用UML类图分析JDK所支持或应用的设计模式的结构,并与GOF的结构加以...

    Java JDK 6学习笔记——ppt简体版

    这份"Java JDK 6学习笔记——ppt简体版"很可能是对这一版本特性和使用方法的详细讲解,旨在帮助初学者和有经验的开发者深入理解JDK 6的核心功能和改进。 JDK(Java Development Kit)是Java编程语言的软件开发工具...

    JDK 6学习笔记——PPT简体版

    **JDK 6学习笔记——PPT简体版** Java Development Kit(JDK)是Java编程语言的核心组件,它提供了开发和运行Java应用程序所需的工具和环境。JDK 6是Oracle公司发布的一个重要版本,为开发者带来了许多改进和新特性...

    设计模式在JDK中的应用 (背景、UML结构、角色、职责)

    设计模式在JDK中的应用课设完整报告,Word文档 题目要求: 设计模式在JDK中的应用(结合JDK源码,分析JDK对设计模式的支持与应用)。课设内容包括: (a)用UML类图分析JDK所支持或应用的设计模式的结构,并与GOF的...

Global site tag (gtag.js) - Google Analytics