JDK设计模式应用——单例模式(Singleton)
《JDK源码分析》的分支,讲解设计模式在jdk中使用。
我们从三个方面讲述,一是:jdk源码中的设计模式;二是:讲解设计模式(UML图);三是:实现我们自己的设计模式代码。今天带来最简单的设计模式——单例模式(Singleton)。
一、jdk源码中的设计模式
我们先看java.lang包下的class Runtime
public class Runtime { private Runtime() {}//私有的构造方法 //Runtime类的私有静态实例 private static Runtime currentRuntime = new Runtime(); //获得静态实例的唯一方法 public static Runtime getRuntime() { return currentRuntime; } }
解释:
(1)存在私有的构造函数,不能通过new来得到类的实例。
(2)私有的静态实例,一个class只能对应唯一的对象。
(3)只能通过:类.get方法获得这个唯一的对象实例。
我们可以通过如下代码验证:
Runtime r1 = Runtime.getRuntime(); Runtime r2 = Runtime.getRuntime(); //“==”为地址判断,为true表示:r1与r2指向同一对象。 System.out.println(r1 == r2);
结果显然为:true。
二、讲解设计模式(UML图)
上面是Singleton的UML图。
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。(来源——百度百科)
单例模式的思想使用在很多方面,比如:一台计算机可以有若干打印机,但是一个时间只能有一个Printer Spooler,避免两个文件同时输入到打印机中。
单例模式满足三个条件:
(1)某个类只能有一个实例。
(2)类必须自行创建这个类的实例(创建静态成员变量或者在类的静态方法中生成实例)。
(3)类必须自行向整个系统提供这个实例。
三、实现我们自己的设计模式
我们实现单例模式分为两种:1、静态成员变量 2、静态方法(有人称为饿汉式和懒汉式)
1、静态成员变量
public class SingletonTest { //在类里面实例化静态成员变量 private static SingletonTest singletonTest = new SingletonTest(); private SingletonTest() { } public static SingletonTest getInstance() { return singletonTest; } }
2、静态方法(最常用的方法)
public class SingletonTest { private static SingletonTest singletonTest = null; private SingletonTest() { } public static SingletonTest getInstance() { //在类的静态方法中实例化单例 if (null == singletonTest) { singletonTest = new SingletonTest(); } return singletonTest; } }
3、第二种方法构建单例模式是最常用的,但是在并发程序中会导致单例模式失效。
如下面的代码所示:
public class SingletonTest { private static SingletonTest singletonTest = null; private SingletonTest() { } public static SingletonTest getInstance() { if (null == singletonTest) { try { Thread.sleep((long) (Math.random() * 4000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } singletonTest = new SingletonTest(); } return singletonTest; } public static void main(String[] args) { // 打印出两个对象 new ThreadTest().start(); new ThreadTest().start(); } } class ThreadTest extends Thread { @Override public void run() { System.out.println(SingletonTest.getInstance()); } }
输出的结果是:不是同一个对象,单例模式失效了。
com.shy.test.SingletonTest@55fe910c com.shy.test.SingletonTest@3be4d6ef
对于单例模式(Singleton)来说,如果在 getInstance()方法中生成 Singleton 实例则可能会产生同步问题,即可能会生成两个不同的对象。
解释:
当两个线程同时执行到getInstance()方法时,此时singletonTest为null,两个线程都会分别实例化出一个对象,因此出现了两个对象。
解决方法:(使用synchronized解决同步问题)
public class SingletonTest { private static SingletonTest singletonTest = null; private SingletonTest() { } public static SingletonTest getInstance() { synchronized (SingletonTest.class) { if (null == singletonTest) { singletonTest = new SingletonTest(); } } return singletonTest; } }
总结:Java中单例模式(Singleton Pattern)定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
相关推荐
**设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...
**Java设计模式——深入解析与应用** 在编程领域,设计模式是解决常见问题的经验总结,是一种通用、可重用的解决方案。Java设计模式是面向对象编程中的精华,它为开发者提供了一套标准的方法来处理软件设计中的常见...
8 Singleton单例模式 2. 9 Factory工厂模式 2. 10 Adapter适配器模式 第3章 数字 3. 1 数字与数字封装类 3. 2 格式化数字 3. 3 数字的舍入 3. 4 转换数字的进制 3. 5 生成随机数 ...
在Java高级面试中,面试官通常会关注候选人在核心Java、多线程、集合框架、JVM内存管理、设计模式、数据库操作、网络编程、异常处理、IO流、Spring框架及其实现原理等方面的知识掌握程度。以下是根据这些关键点展开...
通过@Scope注解控制Bean的作用域,如单例(singleton)或多例(prototype)。此外,还可以通过BeanPostProcessor和InitializingBean接口自定义Bean的初始化和销毁逻辑。 6. **AOP代理**:Spring支持JDK动态代理和...
**ScrabbleGame** 是一个基于Java开发的拼字游戏应用,它展示了面向对象的设计(Object-Oriented Design, OOD)以及设计模式在实际项目中的应用。该项目源自CMU的15214课程——软件系统构造原理,旨在帮助学习者通过...
•JDk还提供了自动装箱和自动拆箱。自动装箱就是把一个基本类型的变量直接赋给对应的包装类变量,自动拆箱 则与之相反。 •包装类还可以实现基本类型变量和字符串之间的转换,除了Character之外的所有包装类都...