享元模式在程序中的应用

       享元模式的概念:如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象。说白了就是减少创建对象的数量,以减少内存占用和从而提高系统性能。我举个简单的场景,我们根据异常code码定义了几个异常,程序在处理过程中抛出这些异常,正常来讲,我们通过new一个RuntimeException就好了,但是如果程序的调用量比较大的时候频繁的new一些临时对象,会引起GC,影响系统稳定,我们可以考虑把这几个对象缓存起来,这样就可以不用频繁创建对象,其实这就是一种池技术了,像String常量池、数据库连接池、缓冲池等等都是享元模式的应用,因此享元模式是池技术的重要实现方式。代码比较简单,直接看代码就好

public enum DomainCodeEnum {

    SUCCESS(0, "接口操作成功"),
    PARAM_ERROR(10000 , "请求参数校验错误"),
    INFRA_ERROR(30000 , "基础组件(数据库,缓存,消息等)错误"),
    SYS_ERROR(40000 , "未知的其它系统错误");

    private Integer errCode;
    private String errDesc;

    private DomainCodeEnum(Integer errCode, String errDesc){
        this.errCode = errCode;
        this.errDesc = errDesc;
    }

    public Integer getErrCode() {
        return errCode;
    }

    public String getErrDesc() {
        return errDesc;
    }
    public static DomainCodeEnum getCodeEnum(Integer code) {
        for (DomainCodeEnum codeEnum : DomainCodeEnum.values()) {
            if (codeEnum.getErrCode().equals(code)) {
                return codeEnum;
            }
        }
        return null;
    }


    public String getErrDesc(Integer code) {
        return getCodeEnum(code).getErrDesc();
    }

}

public class BizRuntimeException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    private DomainCodeEnum errCode;

    public BizRuntimeException(String errMessage){
        super(errMessage);
        this.setErrCode(DomainCodeEnum.BIZ_ERROR);
    }

    public BizRuntimeException(DomainCodeEnum errCode){
        super(errCode.getErrDesc());
        this.setErrCode(errCode);
        System.out.println(errCode.getErrDesc());
    }

    public BizRuntimeException(DomainCodeEnum errCode, String errMessage){
        super(errMessage);
        this.setErrCode(errCode);
    }

    public BizRuntimeException(String errMessage, Throwable e) {
        super(errMessage, e);
        this.setErrCode(DomainCodeEnum.BIZ_ERROR);
    }

    public DomainCodeEnum getErrCode() {
        return errCode;
    }

    public void setErrCode(DomainCodeEnum errCode) {
        this.errCode = errCode;
    }


}


public class BizRuntimeExceptionFactory {

    private static final Map<DomainCodeEnum, BizRuntimeException> bizRuntimeExceptionPools =new HashMap<>();

    private static BizRuntimeExceptionFactory factory=new BizRuntimeExceptionFactory();

    public static BizRuntimeExceptionFactory getInstance() {
        return factory;
    }

    public BizRuntimeException getBizRuntimeException(DomainCodeEnum errCode){
        BizRuntimeException bizRuntimeException=null;
        if(bizRuntimeExceptionPools.containsKey(errCode)){
            System.out.println("已存在的异常"+errCode);
            bizRuntimeException=bizRuntimeExceptionPools.get(errCode);
        }else{
            bizRuntimeException=new BizRuntimeException(errCode);
            bizRuntimeExceptionPools.put(errCode,bizRuntimeException);
        }
        return bizRuntimeException;
    }
}


public class TestDemo {
    private static List<BizRuntimeException> bizRuntimeExceptions=new ArrayList<>();
    private static BizRuntimeExceptionFactory factory;
    public static void main(String[] args) {
        factory =BizRuntimeExceptionFactory.getInstance();
        bizRuntimeExceptions.add(factory.getBizRuntimeException(DomainCodeEnum.LARGE_LOGISTICS_PARSE_ERROR));
        bizRuntimeExceptions.add(factory.getBizRuntimeException(DomainCodeEnum.BASIC_ORDER_PARSE_ERROR));
        bizRuntimeExceptions.add(factory.getBizRuntimeException(DomainCodeEnum.SUPPLIER_PARSE_ERROR));
        bizRuntimeExceptions.add(factory.getBizRuntimeException(DomainCodeEnum.LARGE_LOGISTICS_PARSE_ERROR));
        bizRuntimeExceptions.add(factory.getBizRuntimeException(DomainCodeEnum.BASIC_ORDER_PARSE_ERROR));
        bizRuntimeExceptions.add(factory.getBizRuntimeException(DomainCodeEnum.SUPPLIER_PARSE_ERROR));
    }



}

    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值