1. 程式人生 > >設計模式(實戰)-單例模式

設計模式(實戰)-單例模式

一:單例模式說明

模式定義:確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。(取自《設計模式之禪》)。

通用類圖:

  1. 構造方法私有化,讓外界無法對物件進行例項化,保證一個類只有一個物件
  2. 通過方法獲取例項

二:專案實戰

修改原因:之前的版本中,每個類使用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();
	}