享元模式的概念:如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象。说白了就是减少创建对象的数量,以减少内存占用和从而提高系统性能。我举个简单的场景,我们根据异常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));
}
}