工场模式在电子保单模板打印中的实际应用

工厂模式在电子保单模板打印中的实际应用

最近,遇到分别调用打印一个产品的 3 种打印电子保单的情况,用工厂模式实现比较方便灵活:

其实现如下:

定义工厂抽象类:EPolicyDataProvider

 

public abstract class EPolicyDataProvider {

	public abstract String createEPolicyXml(YwxCommonPolicy policy, DocumentPrint docPrint)
			throws GenerateEPolicyException;

	protected Document createDoc() {
		return DocumentHelper.createDocument();
	}

	protected Element createRoot(Document doc) {
						"http://www.cpic.com.cn/epolicy/reportservice report.xsd");
		return root;
	}
	
	protected String toString(Document doc) throws GenerateEPolicyException {
		try {
			xw.write(doc);
		} catch (IOException e) {
			throw new GenerateEPolicyException("创建电子保单报文XML失败!", e);
		}
		return ss.toString();
	}
}

 

定义3 个实现类:举例其中一个:  还有2 个 名称为 HmV8001EPolicyDateProvider      HmV8002EPolicyDateProvider    都是扩展这个 EPolicyDataProvider  的抽象类。

 

/**
 * 凯尔乐行*综合保险(S超值型)
 * @author pengfr
 *
 */
public class HmV8000EPolicyDateProvider extends EPolicyDataProvider {

	@Override
	public String createEPolicyXml(YwxCommonPolicy policy,
			DocumentPrint docPrint) throws GenerateEPolicyException {
		// TODO Auto-generated method stub
		Document doc = createDoc();
		// 创建根结点
		Element root = createRoot(doc);
		// 创建parameters结点
		Element parameters = root.addElement("parameters");
		// 添加报表各parameter参数
		if (policy == null) {
			throw new GenerateEPolicyException("创建*旅行综合电子保单XML报文失败,原因:保单信息不能为空!");
		}.......................

		
		
		root.addElement("fields");
		// 格式化输出
		return toString(doc);
	}

}

 

 

定义灵活的配置调用类:

 

	public class Config {
		/** 应用名称 */
		public String applyName;
		/** 数据提供者 */
		public EPolicyDataProvider provider;
	}

 

 

 

/** 数据提供者类包名前缀 */
	private static final String packagePrefix = "com.cpic.b2bcore.datamanager.datainterface.epolicyinterface";
	private static EPolicyConfig instance = new EPolicyConfig();
	
public Config getConfig(String className){
                /** 配置集合 */
	private Map<String, Config> configs;
//根据类名生成类的实例
			EPolicyDataProvider provider = null;
			try {
				provider = (EPolicyDataProvider) Class.forName(
						packagePrefix + "." + className).newInstance();
			} catch (Exception e) {
				log.error("电子保单配置不正确,[" + key + "]的类[" + className
						+ "]创建实例失败!");
				return;
			}}

 

 

 

调用方式如下 :

 

Config config = EPolicyConfig.getInstance().getConfig("HmV8000");  //或者其他2 个应用的标识
		if (config == null) {
			throw new GenerateEPolicyException("生成电子保单失败,无法获取产品["
					+ policy.getProduct().getProductCode() + "]电子保单配置信息!");
		}
//在上面getConfig方法中, 根据应用标识生成provider的实例类。  就相当于工厂根据标识符的要求,生成了符合要求的"产品"
		// 应用名称 app_name
		bean.setApp_name(config.applyName);
		// XML报文信息 xmlvalue
		bean.setXmlvalue(config.provider.createEPolicyXml(policy, docPrint));