前言
日常开发中,经常需要使用很多比较常用的工具来。但是一个一个调用有时候看起来就会比较复杂,不易理解。推荐可以自己创建一个属于自己的工厂调用专属自己的工具。创建工厂模式的步骤如下。
一、定义一个注解
创建注解的目的是为了通过获取注解里的值,获取类的名称
代码如下(示例):
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 存储工具类名字的注解
*/
@Target(value={ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ToolName {
public String name();
}
二、创建属于自己的工厂模式
通过反射创建对象,返回给方法使用。同时使用单例模式确保每个对象只有一个,来控制工具类占用过多的内存空间(虽然这部分可能占用并不大)
代码如下(示例):
import java.util.HashMap;
import java.util.Map;
/**
* 计算工厂类
*/
public class CalToolFactory {
/*工厂实现单例模式*/
private CalToolFactory() {}
private static CalToolFactory fac;
public static synchronized CalToolFactory getInstance(){
if(fac==null){
fac=new CalToolFactory();
}return fac;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------
/**
* @param datas 存储创建的对象
*/
private Map<String,Object> datas=new HashMap<String,Object>();
private static final String PACKNAME = "n.tool.cal.";/*所获取对象所在包全名*/
/**
* 获取任意方法的注解中存储的需要创建的实体类的类全名
* @param type 方法名字
* @return
* @throws NoSuchMethodException
* @throws SecurityException
*/
private Object getToolClass(String type) throws Exception{
return Class.forName(CalToolFactory.PACKNAME + this.getClass().getMethod(type).getAnnotation(ToolName.class).name()
).getDeclaredConstructor().newInstance();
}
/**
* 获取任意方法的注解中存储的需要创建的实体类的名称
* @param type 方法名字
* @return
* @throws NoSuchMethodException
* @throws SecurityException
*/
private String getToolName(String type) throws Exception {
return (String)this.getClass().getMethod(type).getAnnotation(ToolName.class).name();
}
/**
* 获取s对象
* @return
*/
@ToolName(name = "S")
public S getSUtils() {
try{
if(datas.get(this.getToolName("getSUtils"))==null){
Object obj=this.getToolClass("getSUtils");
datas.put(this.getToolName("getSUtils"), obj);
return (S)obj;
}else{
return (S)datas.get(this.getToolName("getSUtils"));
}
} catch (Exception e) {
System.out.println("创建S对象异常");
return null;
}
}
}