JAVA语言泛型编程实现单例模式

今天去面试,面试官问了一个设计模式---单例模式,这也是我们最常用的设计模式,由于面试时间有限,我只是把如何使用泛型编程实现单例模式大致意思说了一下。现在主要说一下如何用泛型编程实现单例模式,使用少量代码,实现一劳永逸的方法。

先来看一下我们简单的object:

package singleton;

/***
 * 
 * @author Linux一叶
 * 只是为了测试时使用
 *
 */
public class People {

	/***
	 * 属性变量
	 * age 年龄
	 * name 名字
	 */
	private int age;
	private String name;

	/***
	 * get set 方法
	 * @return
	 */
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

}

一个很简单的People 对象,为了更好的理解和测试。

下面是主要的实现单例代码

package singleton;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import singleton.People;

/***
 * 
 * @author Linux一叶
 *
 * @param <T>
 */
public class Singleton<T> {

	/***
	 * 采用ConcurrentHashMap集合进行存储
	 * Class 作为key ---对象的类型
	 * Object 作为value---对象的实例化
	 * 实现对象的类型和对象的实例化 一一对应
	 */
	private static final ConcurrentMap<Class, Object> map = new ConcurrentHashMap<>();

	/***
	 * 
	 * @param type  传入进行实例化对象的类型
	 * @return T 即返回对象的实例化
	 */
	public static<T>T getSingleton(Class<T> type){
		/***
		 * 从map中取出对象的相对应的实例
		 * 
		 * 为减少对map的操作,在此处使用局部变量ob  --- 符合优化性能要求
		 */
		Object ob = map.get(type);

			try {
		/***
		 * 对该对象的实例进行null判断
		 */
				if(ob==null){
			/***
			 * 为使用安全的map及其操作  设置同步锁
			 */
					synchronized (map) {
						/***
						 * 创建此 Class 对象所表示的类的一个新实例。
						 * 如同用一个带有一个空参数列表的 new 表达式实例化该类。
						 * 如果该类尚未初始化,则初始化这个类。 
						 */
					ob=  type.newInstance();
					/***
					 * 将对象类型和创建的新实例放进map
					 */
					map.put(type,ob);
					}
				}

			/***
			*  是type.newInstance()产生的两个异常处理
		        *  
			*IllegalAccessException - 如果该类或其 null 构造方法是不可访问的。 
			*InstantiationException - 如果此 Class 表示一个抽象类、接口、数组类、
			*基本类型或 void; 或者该类没有 null 构造方法; 或者由于其他某种原因导致实例化失败
			*
			*在此不做过多处理
			*/
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		/***
		 * 将从map中取出的对象的实例化 转换成泛型参数 返回
		 */
		return  (T) ob;
	}

	/***
	 * 该方法 是从map中移除对象实例化操作
	 * @param type
	 */
	public static<T> void Remove(Class<T> type){
		/***
		 * map移除操作
		 */
		map.remove(type);

	} 

	public static void main(String[] args) {

		/***
		 * 以People 为例 获取其实例化
		 */
		People str = Singleton.getSingleton(People.class);
		/***
		 * 设置测试数据
		 */
		str.setName("tom");
		str.setAge(26);
		/***
		 * 移除测试
		 */
//		Singleton.Remove(People.class);
		People s= Singleton.getSingleton(People.class);

		System.err.println(s.getName()+"--"+s.getAge());

	}
}

到这里为止,我的想法就用例子展现给大家,重点运用了集合和泛型方法,动态的map需要自己手动维护,如果喜欢还可以增加一下其他的map操作,如put

这里要说一下的是Java 和c++ c#的不同,Java中没有new T(),而c++ c#则可以直接new T()来做

时间: 2024-10-13 03:03:12

JAVA语言泛型编程实现单例模式的相关文章

java语言的特性及应用

java语言定义: Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言. Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥有全球最大的开发者专业社群. 组成: Java由四方面组成:●Java编程语言,即语法.●Java文件格式,即各种文件夹.文件的后缀.●Java虚拟机(JVM),即处理*.class文件的解释器.●Java应用程序接口(Java API). Java分为三个体系,分别为Java

java 语言学习大纲

看来java的很多书,感觉目前来说对于大纲来说没有什么好书,还是自己总结一套吧. Java 语言基础: 八种基本数据类型,int(4), float(4), double(8), boolean(1), long(8), shortint (2),byte(1),char(2) String重要的数据类型 集合 collection, map: 重要的JAR  java.util.concurrent, java.io, java.http 继承,接口 反射 消息机制(待定) 队列,多线程,线程

《Java设计模式》之单例模式

在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下. 所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 1. 最简单的实现 首先,能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者.这样,

堆栈--java语言的理解

堆栈 1,概要 堆栈是两种数据结构.堆栈都是一种数据项按序排列的的数据结构,只能在一端进行(称为栈顶(top))对数据项进行插入和删除. 要点:堆,列队优先,先进先出.栈,后进先出(Last-In/ First-Out). 2,对比(Java语言) 1.栈(stack)和堆(heap)都是java用来在Ram中存放数据的地方. 2.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小和生存期必须是确定的,缺乏灵活性.另外,栈数据可以共享.堆的优势是,可以动态

Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]:大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样.但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿.很多人都会碰到过这样的情况:你实现了一个新功能或修复了一个缺陷,并且对自己的修改很满意.但其他人看了你的代码后--也许发生在代码审查环节,完全不买账!对于什么是好代码,什么是坏代码,存在分歧很正常!设计模式的改变设计模式是人们熟悉的另一种设计思想,

Java语言Lang包下常用的工具类介绍_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都很不错,不用你写,不用你调试,只要你发现. 在 Apache Jakarta Common 中, Lang 这个 Java 工具包是所有 Apache Jakarta Common 项目中被使用最广泛的,几乎你所知道的名气比较大的软件里面都有用到它,包括 Tomcat, Weblogic, Webs

java语言概念及特点相关问题

1 .什么是计算机语言? 计算机语言:指人与计算机之间的通信,主要由一些指令组成,指令包括"数字.符号和语法等内容",程序员可以通过这些指令来指挥计算机工作. 计算机语言的种类可以分为以下三类: ①机器语言:由二进制的0和1组成的编码,不便于记忆和识别(用于计算机识别). ②汇编语言:采用了英文缩写的标识符,容易识别与记忆. ③高级语言:采用接近于人类的自然语言进行编程,进一步简化了程序编写的过程. Java是一种高级计算机语言. 2.Java语言的特点? "java程序语言

java语言编程基础

java语言基本要素 高级语言如c++.c#.java等都有一些共同性的东西:关键字.标识符. 运算符.注释.数据类型.常量和变量.语句.函数.数组.高级语言在这些要素上大同小异. Java关键字:一些有特定含义,有专门用途的字符串(keyword).Java中关键字均为小写.如do while if int等.不需要记,用多了自然会知道. 标识符 自定义的名称.如类名.变量名.方法名等.合法标识符规则:1 不可使用关键子字 2 不能以数字开头.在java中标识符可有26个英文大小写字母.数字0

Java语言

Java第一次亮相是在1994年由Sun公司技术总监JohnGage提出这个概念,96年正式推广第一个版本jdk1.0,到现在常用的有1.6和被oracle收购后发布的1.7版本. Java语言特点:相对C++语言更加通俗易懂,更没有指针,Java可以在任何一个平台操作系统上运行,程序员只需要编写程序一次就行,Java具有开源.伸缩性.扩展性.同时Java采用多线程可以让程序同步做多个任务. 语言运行方式:创建.java文件--通过javac编译文件生成.class文件在通过jvm虚拟机转换成二