博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA语言泛型编程实现单例模式
阅读量:7108 次
发布时间:2019-06-28

本文共 2649 字,大约阅读时间需要 8 分钟。

hot3.png

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

先来看一下我们简单的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 
 */public class Singleton
 { /***  * 采用ConcurrentHashMap集合进行存储  * Class 作为key ---对象的类型  * Object 作为value---对象的实例化  * 实现对象的类型和对象的实例化 一一对应  */ private static final ConcurrentMap
 map = new ConcurrentHashMap<>(); /***  *   * @param type  传入进行实例化对象的类型  * @return T 即返回对象的实例化  */ public static
T getSingleton(Class
 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
 void Remove(Class
 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()来做

转载于:https://my.oschina.net/heavenly/blog/502574

你可能感兴趣的文章
Cisco交换机密码破解方法
查看>>
使用VS2010中 编码的UI 测试 进行UI自动化测试
查看>>
IOS UITableView 使用总结
查看>>
play 源码分析
查看>>
Log4j针对不同包指定level
查看>>
Android中怎么启动关闭Service及功能解释
查看>>
SpringBoot入门八,添加定时任务
查看>>
我的友情链接
查看>>
SpringMVC springMVC的拦截器
查看>>
Zabbix的安装部署
查看>>
php把二维数组转化为字符串
查看>>
目录与文件属性——《Unix/Linux编程实践教程》读书笔记
查看>>
5年麦肯锡工作经验的GG总结的Word骨灰级操作大全
查看>>
Xcode下载
查看>>
python operator计算模块
查看>>
SVN版本冲突解决详解
查看>>
nginx rewrite规则
查看>>
浅谈javascript:void(0)的含义
查看>>
IOS学习动画一之 UIKit动画
查看>>
tomcat编码乱码问题
查看>>