Java单例模式的终结者

Posted 谷哥的小弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java单例模式的终结者相关的知识,希望对你有一定的参考价值。


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址: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);
	



结果如下:

反射技术与单例模式

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

代码如下:

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单例模式的终结者的主要内容,如果未能解决你的问题,请参考以下文章

Java单例模式的终结者

漫画详解9种Java单例模式

spring单例和非单例的问题

Java设计模式 - 单例模式

单例模式

Java单例模式