java开发中将常用工具类统一使用工厂模式进行整理


前言

日常开发中,经常需要使用很多比较常用的工具来。但是一个一个调用有时候看起来就会比较复杂,不易理解。推荐可以自己创建一个属于自己的工厂调用专属自己的工具。创建工厂模式的步骤如下。


一、定义一个注解

创建注解的目的是为了通过获取注解里的值,获取类的名称
代码如下(示例):

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;
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuxu1116

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值