/** * 单例设计模式(单ClassLoader) * * 1、懒汉式: * 线程不安全、调用效率高、可以延迟加载 * 线程安全、调用效率低、可以延迟加载(加 synchronized 线程安全) * 2、恶汉式: * 线程安全、调用效率高、不可以延迟加载 * 3、静态内部类: * 线程安全、调用效率高、可以延迟加载 * 4、双重检测锁: * 线程不安全、调用效率高、可以延迟加载 * 看似线程安全,但基于JVM内部模型,我们并不能完全控制程序执行过程 * 虽然 volatile 关键字可以解决该问题,但不兼容JDK1.5之前的版本 * 5、枚举单例: * 线程安全、调用效率高、不可以延迟加载 * 但是缺少了普通类的一些特性,不兼容JDK1.5之前的版本 */ public class SingletionTest1 { public static void main(String[] args) { MyJvm1 jvm1 = MyJvm1.getInstance(); MyJvm1 jvm1a = MyJvm1.getInstance(); MyJvm2 jvm2 = MyJvm2.getInstance(); MyJvm2 jvm2a = MyJvm2.getInstance(); MyJvm3 jvm3 = MyJvm3.getInstance(); MyJvm3 jvm3a = MyJvm3.getInstance(); MyJvm4 jvm4 = MyJvm4.getInstance(); MyJvm4 jvm4a = MyJvm4.getInstance(); MyJvm5 jvm5 = MyJvm5.instance; MyJvm5 jvm5a = MyJvm5.instance; System.out.println(jvm1==jvm1a); System.out.println(jvm2==jvm2a); System.out.println(jvm3==jvm3a); System.out.println(jvm4==jvm4a); System.out.println(jvm5==jvm5a); } /** * 5、枚举类 */ public enum MyJvm5{ instance; public void doSomething(){ } } } /** * 1、懒汉式 * --> 构造私有化 * --> 声明私有静态变量 * --> 对外提供访问静态变量方法,并保证获取对象存在 */ class MyJvm1{ private static MyJvm1 instance; private MyJvm1(){} public static MyJvm1 getInstance(){ if(null == instance){ instance = new MyJvm1(); } return instance; } } /** * 2、恶汉式 * --> 构造私有化 * --> 声明私有变量,并初始化 * --> 对外提供访问静态变量方法 */ class MyJvm2{ private static MyJvm2 instance = new MyJvm2(); private MyJvm2(){} public static MyJvm2 getInstance(){ return instance; } } /** * 3、静态内部类 * --> 构造私有化 * --> 声明静态内部类,内部类中声明私有变量并初始化 * --> 对外提供访问 静态内部类的静态变量 的方法 */ class MyJvm3{ private static class JVMHolder{ private static MyJvm3 instance = new MyJvm3(); } private MyJvm3(){} public static MyJvm3 getInstance(){ return JVMHolder.instance; } } /** * 4、双重校验 * --> 懒汉式的改进,线程安全 */ class MyJvm4{ private static MyJvm4 instance; private MyJvm4(){} public static MyJvm4 getInstance(){ if(null==instance){ synchronized(MyJvm4.class){ if(null==instance){ instance = new MyJvm4(); } } } return instance; } }
/** * 单例 防反射、防反序列化 方法 * * 反射: * 在构造方法中判断实例是否为null,不为null则抛出异常阻止操作 * 序列化: * 重写 readResolve() 返回单例 */ public class SingletionTest2 { public static void main(String[] args){ //单例普通获取方法 MyJvm7 jvm1 = MyJvm7.getInstance(); MyJvm7 jvm2 = MyJvm7.getInstance(); System.out.println(jvm1); System.out.println(jvm2); //未作处理 通过反射可以获取新的对象实例 MyJvm3 jvm3 = getOtherInstance1(MyJvm3.class); MyJvm3 jvm4 = getOtherInstance1(MyJvm3.class); System.out.println(jvm3); System.out.println(jvm4); //处理后 通过反射获取对象实例时会抛出异常 MyJvm7 jvm5 = getOtherInstance1(MyJvm7.class); MyJvm7 jvm6 = getOtherInstance1(MyJvm7.class); System.out.println(jvm5); System.out.println(jvm6); //经过 序列化-->反序列化 可以得到新的对象实例 MyJvm8 jvm7 = MyJvm8.getInstance(); MyJvm8 jvm8 = getOtherInstance2(MyJvm8.class,jvm7); System.out.println(jvm7); System.out.println(jvm8); //处理后 反序列化得到的对象为单例对象 MyJvm9 jvm9 = MyJvm9.getInstance(); MyJvm9 jvm10 = getOtherInstance2(MyJvm9.class,jvm9); System.out.println(jvm9); System.out.println(jvm10); } /** * 测试方法 * 根据反射,跳过 安全性检查(private) * 通过构造方法实例化对象 */ public static <T> T getOtherInstance1(Class<T> clazz){ Constructor<T> c; T returnObj = null; try { c = clazz.getDeclaredConstructor(); c.setAccessible(true); returnObj = c.newInstance(); } catch (Exception e) { e.printStackTrace(); } return returnObj; } /** * 测试方法 * 通过 序列化-->反序列化 获取新的对象实例 */ @SuppressWarnings("unchecked") public static <T> T getOtherInstance2(Class<T> clazz,Object instance){ T returnObj = null; try{ FileOutputStream fos = new FileOutputStream("d:/a.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(instance); oos.close(); fos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.txt")); returnObj = (T) ois.readObject(); ois.close(); }catch(Exception e){ e.printStackTrace(); } return returnObj; } } class MyJvm7{ private static class JVMHolder{ private static MyJvm7 instance = new MyJvm7(); } private MyJvm7(){ if(null!=JVMHolder.instance){ throw new RuntimeException();//阻止反射实例化对象 } } public static MyJvm7 getInstance(){ return JVMHolder.instance; } } class MyJvm8 implements Serializable{ private static final long serialVersionUID = 1L; private static class JVMHolder{ private static MyJvm8 instance = new MyJvm8(); } private MyJvm8(){} public static MyJvm8 getInstance(){ return JVMHolder.instance; } } class MyJvm9 implements Serializable{ private static final long serialVersionUID = 1L; private static class JVMHolder{ private static MyJvm9 instance = new MyJvm9(); } private MyJvm9(){} public static MyJvm9 getInstance(){ return JVMHolder.instance; } private Object readResolve() throws ObjectStreamException { return JVMHolder.instance;//序列化返回单例对象 } }
相关推荐
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。...无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的专业技能。
初级程序员可以学习设计模式的基本概念和应用,高级程序员能够从书中掌握更多高级技巧,而系统分析师可以通过设计模式来解决项目中遇到的复杂问题。 总体而言,设计模式是软件工程领域的宝贵财富,而《JAVA设计模式...
《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...
《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...
《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书...综上所述,本书不仅是一本关于设计模式的入门书,也是对设计模式应用的深入探讨,无论是对于初级开发者、高级程序员,还是系统分析师,都能从中获得价值。
《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...
单例模式是应用最广的模式之一,也可能是很多初级工程师唯一会使用的设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的...
设计模式是软件工程中的一种最佳实践,它提供了一套经过时间考验的解决方案,用来解决在设计可复用、可维护的...无论是初级开发者还是经验丰富的工程师,都应该不断探索和熟练运用设计模式,以实现更高质量的软件开发。
- **初级开发者**:可以学习JavaScript的基础知识和一些简单的设计模式。 - **中级开发者**:可以通过学习设计模式进阶,了解更高级的设计模式和技术细节。 - **高级开发者**:可以深入了解设计模式的应用,以及如何...
创建型模式主要关注对象的创建,提供了灵活创建对象的方法,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 2. 结构型模式 结构型模式涉及如何组合类和对象以获得更大的结构。包括适配器模式、...
1. 创建型模式(Creational Patterns):主要处理对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。...
- **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。 2. **结构型模式**:关注于如何组合类和对象以形成更大的结构,从而简化程序的复杂性。 - **代理模式**:为其他对象提供一个代理,以便控制对这...
- **设计模式**:例如单例模式、工厂模式、观察者模式等在Android中的应用。 - **网络编程**:使用Retrofit、OkHttp等库进行HTTP请求,理解JSON解析,如Gson、Jackson。 - **单元测试和集成测试**:JUnit、...
它是创建型设计模式的一种,在Java中,单例模式保证了全局只有一个实例,常用于数据库连接池和线程池。 4. 多例模式(Multiton Pattern) 多例模式是单例模式的扩展,它允许创建有限数量的实例。与单例不同,多例...