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