高手们,大侠们,过来支招。需求:
1、 可以生成PDF、Excel、Htm三种格式的报表,并且支持报表的打印,以后可能有新的文件格式需要。
2、 有五个模块需要生成报表,以后可能还有其它模块还要生成报表。
目前的五个模块的显示样式并不一样,以后的也未必一样,比如
报表1
操作名称 操作 时间
报表2
责任人 事故发生地点 事故发生时间 事故处理经过 是否处理完毕
……
……
设计:
因为报表各不一致(文件格式和显示样式),所以用工厂模式。
分析:在第一种和第二种工厂生成方式中我觉得还是需要第二种。
(1)工厂模式中,产品是不同文件格式的报表。所以文件格式作为不同分类的标准。
Public interface Report{
Public void generateReport(reportName,reportContent);
}Public class ReportExcel implements Report{
Public void generateReport(reportName,reportContent){……..}
}Public class ReportPdf implements Report{
Public void generateReport(reportName,reportContent){……..}
}Public interface Factory{
Public Report createReportInstance();
}Public class FactoryExcel implements Factory{
Public Report createReportInstance(){return new ReportExcel();}
}Public class FactoryPdf implements Factory{
Public Report createReportInstance(){return new ReportPdf();}
}Public class Client(){
Main(){
Factory f=new FactoryPdf();
Report r= f.createReportInstance();
r.genereteReport(reportName,reportContent);
}
}
(2)是显示样式不同的报表,所以显示样式(或者模块)作为不同分类的标准,
Public interface Report{
Public void init();
Public void generatePdf();
Public void genereateExcel();
}Public class Module1Report{
Init(){….}  generatePdf(){………..}      generateExcel(){…………}
}Public class Module2Report{
Init(){…..}  generatePdf(){……..}       generteExcel(){….}
}Public interface Factory{
Public Report createReportInstance();

Public FactoryModule1(){
Public Report createReportInstacne(){return new Module1Report;}
}Public FactoryModule2(){
Public Report createReportInstacne(){return new Module2Report;}
}Public class Client(){
Main(){
Factory f=new FactoryPdf();
Report r= f.createReportInstance();
r.genereteExcel();
}
}

解决方案 »

  1.   

    顶第二种,而且可以利用template 模式,以后你需要增加格式的时候,可以在某个特定的模板子类里面增加方法体,不一定要在接口以及所有子类中增加这种格式的处理方式;再加上对2楼说法的赞同,故顶之(顶2楼,顶第2种,怎么全是2.。。)
      

  2.   

    工厂模式的使用就是符合设计模式的开闭原则,从你的需求来说,我觉你的第一种方式只是单纯的对一种报表形式进行了扩充,以满足将来同类型报表形式产生;而你的第二种方式似乎使用了抽象工厂模式,对一个某种形式下所生成的word,excel格式的文件进行了扩充。便于以后再别的情况下生成excel,word文件的扩充(要改变整个类别都必须重新实现)。