最近,遇到分别调用打印一个产品的 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));