欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java单例模式的终结者

程序员文章站 2022-03-21 08:41:40
我们都知道:单例模式的核心在于通过该类只能创建一个对象;就算多次创建所获得的对象均是同一个。有没有办法让一个单例类创建出不同的对象呢?答案是肯定的。今天,我们就来通过反射技术终结单例模式!...

版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

概述

我们都知道:单例模式的核心在于通过该类只能创建一个对象;就算多次创建所获得的对象均是同一个。有没有办法让一个单例类创建出不同的对象呢?答案是肯定的。今天,我们就来通过反射技术终结单例模式!

单例模式回顾

我们先来回顾一下单例模式。

代码如下:

package com.singleton4;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 示例描述:单例设计模式之懒汉式
 */
public class SingletonInstance {
	
	private static SingletonInstance instance = null;

	private SingletonInstance() {
		
	}

	public static synchronized SingletonInstance getInstance() {
		if (instance == null) {
			instance = new SingletonInstance();
		}
		return instance;
	}
}

测试代码:

package com.singleton4;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 本文作者:谷哥的小弟 
* 博客地址:http://blog.csdn.net/lfdfhl
* 示例描述:利用反射技术破坏单例模式
*/
public class SingletonDemo {

	public static void main(String[] args) {
		testSingleton1();
	}
	
	public static void testSingleton1() {
		SingletonInstance instance1 = SingletonInstance.getInstance();
		SingletonInstance instance2 = SingletonInstance.getInstance();
		System.out.println(instance1);
		System.out.println(instance2);
		System.out.println(instance1==instance2);
	}

}

结果如下:

Java单例模式的终结者

反射技术与单例模式

接下来,我们使用反射技术终结单例模式。

代码如下:

package com.singleton4;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 本文作者:谷哥的小弟 
* 博客地址:http://blog.csdn.net/lfdfhl
* 示例描述:利用反射技术破坏单例模式
*/
public class SingletonDemo {

	public static void main(String[] args) {
		testSingleton2();
	}
	
	public static void testSingleton1() {
		SingletonInstance instance1 = SingletonInstance.getInstance();
		SingletonInstance instance2 = SingletonInstance.getInstance();
		System.out.println(instance1);
		System.out.println(instance2);
		System.out.println(instance1==instance2);
	}
	
	public static void testSingleton2() {
		Class<SingletonInstance> clazz=SingletonInstance.class;
		try {
			// 获取私有构造函数
			Constructor<SingletonInstance> declaredConstructor = clazz.getDeclaredConstructor();
			// 取消安全性检查
			declaredConstructor.setAccessible(true);
			try {
				// 创建对象
				SingletonInstance instance1 = declaredConstructor.newInstance();
				SingletonInstance instance2 = declaredConstructor.newInstance();
				System.out.println(instance1);
				System.out.println(instance2);
				System.out.println(instance1==instance2);
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}

}

结果如下:

Java单例模式的终结者

本文地址:https://blog.csdn.net/lfdfhl/article/details/110940777

相关标签: J2SE核心技术