文档章节

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

一一叶
 一一叶
发布于 2015/09/08 01:22
字数 874
阅读 3024
收藏 16

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

先来看一下我们简单的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()来做

© 著作权归作者所有

一一叶
粉丝 28
博文 21
码字总数 8193
作品 0
浦东
高级程序员
私信 提问
加载中

评论(8)

一一叶
一一叶 博主

引用来自“Linux一叶”的评论

在Singleton类中 增加private Singleton(){}防止多个实例,Singleton本身为静态,保持唯一性

引用来自“小飞兴起”的评论

通过字节码注入一样的可以new 一个对象出来
要做字节码加密
iskyhi
iskyhi

引用来自“Linux一叶”的评论

在Singleton类中 增加private Singleton(){}防止多个实例,Singleton本身为静态,保持唯一性
通过字节码注入一样的可以new 一个对象出来
一一叶
一一叶 博主
在Singleton类中 增加private Singleton(){}防止多个实例,Singleton本身为静态,保持唯一性
一一叶
一一叶 博主

引用来自“Linux一叶”的评论

确实只有一个实例,只是不同的引用而已

引用来自“billnh3”的评论

我可以new People出来
在People类中,加入private People(){}
billnh3
billnh3

引用来自“Linux一叶”的评论

确实只有一个实例,只是不同的引用而已
我可以new People出来
一一叶
一一叶 博主
确实只有一个实例,只是不同的引用而已
billnh3
billnh3
你这样实现单例就失去意义了,单例是保证系统中类的对象只有一个。
一一叶
一一叶 博主
也是为了减少工程代码量,减少逻辑处理代码重复率,提高重复使用率,提高开发效率。
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
2018/09/10
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0
Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]: 大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样。但是大多数的Java代码都不是由开发J...

原创小博客
2018/07/17
32
0
Java语言编程学习之Lambda表达式设计和架构的原则

大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样。但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿。 很多人都...

JAVA高级架构开发
2018/08/19
0
0
前端设计模式(1)--工厂模式

写在前面 设计模式有23种,按大类归类的话可以分为三大类:创建型(如:工厂模式、单例模式、原型模式等),结构型模式(如装饰器模式、代理模式等),行为型(如:观察者模式、迭代器模式等...

duffy
02/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部