一:单例模式说明
模式定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。(取自《设计模式之禅》)。
通用类图:
- 构造方法私有化,让外界无法对对象进行实例化,保证一个类只有一个对象
- 通过方法获取实例
二:项目实战
修改原因:之前的版本中,每个类使用Echarts工厂都会new一个新的对象,显然不符合程序优化设计。
在上篇 设计模式(实战)-抽象工厂模式
传送门:https://blog.csdn.net/xiewenfeng520/article/details/83544073
的基础之上将DefaultEchartsFactory修改为单例模式:如图中红色框框所示位置
修改代码如下:
DefaultEchartsFactory
package com.huajie.service.echarts;
import java.lang.reflect.Method;
import java.util.Map;
import org.springframework.beans.BeansException;
import com.huajie.utils.Spring.SpringUtils;
public class DefaultEchartsFactory extends EchartsFactory {
private static final EchartsFactory echartsFactory = new DefaultEchartsFactory();
//1.构造方法私有化,让外界无法对对象进行实例化,保证一个类只有一个对象
private DefaultEchartsFactory(){
}
//2.通过方法获取实例
public static EchartsFactory getEchartsFactory(){
return echartsFactory;
}
@Override
public AbstractBarSimple createBarSimple(Map<String, Object> parameters, Class<?> cls) {
return (AbstractBarSimple)getBeanInstance(cls,parameters);
}
@Override
public AbstractLineSimple createLineSimple(Map<String, Object> parameters, Class<?> cls) {
return (AbstractLineSimple)getBeanInstance(cls,parameters);
}
@SuppressWarnings("unchecked")
public static <T> T getBeanInstance(Class<T> cls,Map<String, Object> parameters) throws BeansException {
try {
/**
* 如果使用反射newInstance()之后<br/>
* cls实现类springIOC容器失效<br/>
* 所以从SpringIOC容器中获取该实例
*/
Object obj = SpringUtils.getBeanByName(cls);
Method method = cls.getDeclaredMethod("setParameters", new Class[] { Map.class });
method.setAccessible(true);
method.invoke(obj, parameters);
return (T)obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
业务模板调用的代码如下:
private EchartsFactory echartsFactory = DefaultEchartsFactory.getEchartsFactory();
@Override
public BarSimple getBarSimple(Map<String, Object> conditionMap) {
AbstractBarSimple createBarSimple = echartsFactory.createBarSimple(conditionMap,BarSimpleImpl.class);
return createBarSimple.initEchartsData();
}
@Override
public LineSimple getLineSimple(Map<String, Object> conditionMap) {
AbstractLineSimple createLineSimple = echartsFactory.createLineSimple(conditionMap,LineSimpleImpl.class);
return createLineSimple.initEchartsData();
}