在C#中Factory的构造函数参数,我做得对吗?

时间:2016-02-23 12:18:01

标签: c# asp.net-mvc design-patterns factory

我在下面解释了我的问题,我的问题是: 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;
     }
}

另请注意,我是从抽象工厂和具体类继承的 我的代码有意义吗?或者我做错了吗?请指出我正确的方向。谢谢!

1 个答案:

答案 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;
     }
}

使用Dependency Injection Container

也是一种很好的做法