先在此保存,之后可能再有改动。
为什么要用单例模式泛型?
泛型单例模式可动态获取单例对象,可简化多个类要单例时的重复代码。
1、泛型单例模式设计
package com.dfxh.designpattern;
import android.util.Log;
import java.util.HashMap;
/**
* <pre>
* author : WangChaowei
* time : 2018/3/28.
* desc : 单例模式泛型
* </pre>
*/
public class SingletonInstance {
private static HashMap mHashMap = new HashMap();
private static final String TAG = "SingletonInstance";
/**
* 让构造函数为 private,这样该类就不会被实例化
*/
private SingletonInstance(){}
/**
* 获取单例对象
* @param tClass
* @param <T>
* @return
*/
public static <T>T getInstance(Class<T> tClass){
Object tClassOb = mHashMap.get(tClass);
if (tClassOb == null){
//使用同步锁
synchronized (mHashMap){
try {
tClassOb = tClass.newInstance();
mHashMap.put(tClass,tClassOb); //以键值对存储在HashMap中,class类作为key值,class类对象作为value值
Log.i(TAG, "getInstance,单例实例创建成功");
} catch (InstantiationException e) {
e.printStackTrace();
Log.e(TAG, "getInstance,单例实例创建失败" + e);
} catch (IllegalAccessException e) {
e.printStackTrace();
Log.e(TAG, "getInstance,单例实例创建失败" + e);
}
}
}
return (T)tClassOb;
}
/**
* 从hashMap中移除对象
* @param tClass
* @param <T>
*/
public <T> void removeInstance(Class<T> tClass){
mHashMap.remove(tClass);
}
}
接下来测试。。。
2、要获取单例对象的类
package com.dfxh.designpatterntest;
/**
* <pre>
* author : WangChaowei
* time : 2018/3/28.
* desc : bean类
* </pre>
*/
public class People {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3、Activity中动态获取单例对象
/**
* 测试单例泛型
*/
private void singletonInstanceTest() {
People people = SingletonInstance.getInstance(People.class);
people.setName("第一次");
people.setAge(2);
Log.i(TAG, "第一次创建对象:" + people.getName() + people.getAge());
People a = SingletonInstance.getInstance(People.class);
people.setName("第二次");
Log.i(TAG, "第二次创建对象:" + a.getName() + people.getAge());
}