设计模式(实战)-单例模式

一:单例模式说明

模式定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。(取自《设计模式之禅》)。

通用类图:

  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();
	}

猜你喜欢

转载自blog.csdn.net/xiewenfeng520/article/details/83684172