設計模式(實戰)-單例模式
阿新 • • 發佈:2018-12-15
一:單例模式說明
模式定義:確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。(取自《設計模式之禪》)。
通用類圖:
- 構造方法私有化,讓外界無法對物件進行例項化,保證一個類只有一個物件
- 通過方法獲取例項
二:專案實戰
修改原因:之前的版本中,每個類使用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(); }