我在下面解释了我的问题,我的问题是: 1.我是否正确使用工厂模式来解决这个问题 我做得对吗?
我有一个可以称为事件跟踪系统,由工作人员/管理人员在建筑工地中使用,它是在ASP.NET MVC中开发的,该应用程序存储在不同位置发生的不同类型的事件。现在我必须为用户提供一种基于位置,事件类型等生成报告的方法。
这就是我在我的代码中执行此操作的方法(为简洁起见,在某些部分中包含了注释而不是代码) -
//Controller methods
public ActionResult ReportByLocation(){
var incidents = GetDataFromRepo();
var reportFactory = new IncidentReportFactory(incidents, "ByLocation");
var pdfView = new ReportsGenerator(reportFactory).GetPdfView();
return pdfView;
}
public ActionResult ReportByType(){
var incidents = GetDataFromRepo();
var reportFactory = new IncidentReportFactory(incidents, "ByType");
var pdfView = new ReportsGenerator(reportFactory).GetPdfView();
return pdfView;
}
//Concrete factory class
public class IncidentReportFactory : ReportFactory{
public IncidentFactory(List<Incident> incidents, string reportType){
//Initialize properties
}
public ConcreteReport CreateConcreteReport(){
switch(ReportType){
case "ByLocation": return new IncidentLocationReport(incidents);
break;
case "ByType": return new IncidentTypeReport(incidents);
break;
}
}
}
//ConcreteReport class
public class IncidentLocationReport : ConcreteReport{
public IncidentLocationReport(List<Incident> incidents){
//Constructor which sorts, splits, etc. based on location
//and returns
}
}
//Report generator class
public ReportsGenerator{
public ReportsGenerator(ReportFactory factory){
Factory = factory;
}
public PDFView GetPdfView(){
var report = factory.CreateConcreteReport();
var pdfView = ConstructPdfWithAllFormatting(report);
return pdfView;
}
}
另请注意,我是从抽象工厂和具体类继承的 我的代码有意义吗?或者我做错了吗?请指出我正确的方向。谢谢!
答案 0 :(得分:2)
Basicaly你是对的。
您的课程IncidentReportFactory
与metohd CreateConcreteReport
创建了ConcreteReport
对象,取决于reportType
从抽象类继承是我的意见不是nessesery。您的ReportFactory
抽象类没有方法,因此不需要使用它。当不是方法女巫可以共享的时候是低抽象。有接口这样做很好。
public interface IIncidentReportFactory
{
public IConcreteReport CreateConcreteReport();
}
实施:
public class IncidentReportFactory : IIncidentReportFactory
{
public IncidentFactory(List<Incident> incidents, string reportType)
{
//Initialize properties
}
public ConcreteReport CreateConcreteReport()
{
switch(this.ReportType)
{
case "ByLocation": return new IncidentLocationReport(incidents);
break;
case "ByType": return new IncidentTypeReport(incidents);
break;
}
return null //no match
}
此外,您必须更改名称:
var reportFactory = new IncidentReportFactory(incidents, "ByLocation");
reportFactory
是一个非常误解的名字。 reportFactory
不是ConcreteReport
对象。
当您将抽象类更改为接口时,ReportsGenerator
类就像这样
//Report generator class
public ReportsGenerator{
public ReportsGenerator(IConcreteReport concreteReport){
this.concreteReport= concreteReport;
}
public PDFView GetPdfView(){
var pdfView = ConstructPdfWithAllFormatting(this.concreteReport);
return pdfView;
}
}
也是一种很好的做法