【问题标题】:Is this right usage of factory pattern?这是工厂模式的正确用法吗?
【发布时间】:2012-10-29 21:57:56
【问题描述】:

有设计问题,也许你可以帮忙决定。

我的客户对象可以请求Report 类的对象集。有一组定义的可用报告,根据客户的权限,不同的报告可以包含在返回的集合中。每个请求都会创建报告(每个客户都会在每个请求上获得全新的报告实例)。

我是否应该使用一种“工厂”来封装报告创建,如下所示:

public class ReportsFactory {

    private UserPermissionsChecker permissionsChecker;

    public Set<Report> createReports() {
        Set<Report> reports = new HashSet<Report>();
        if(permissionsChecker.hasAccessTo('report A')) {
            reports.add(createReportA());
        }
        if(permissionsChecker.hasAccessTo('report B')) {
            reports.add(createReportB());
        }
        if(permissionsChecker.hasAccessTo('report C')) {
            reports.add(createReportC());
        }
        return reports;
    }

    private Report createReportA() {...}
    private Report createReportB() {...}
    private Report createReportC() {...}
}

这是对所谓的简单工厂模式的正确用法吗?或者您有其他建议吗?

** 编辑 **

下面的一些 cmets 说这不完全是工厂模式。如果不是,我怎么称呼它?

【问题讨论】:

  • 我认为这没有任何问题。您怀疑自己的方法有什么具体原因吗?
  • 那些重复的“如果”部分具有相同的模式:如果有资格,则创建。我想知道是否有更好的方法来封装它,例如遵循“告诉不问”的原则。但我认为这可能是过度设计。
  • 那些if 包含在内部。如果您添加对更多报告的支持,则无需更改其他代码。所以恕我直言,这很好。

标签: java design-patterns factory-pattern


【解决方案1】:

我认为设计是正确的,但这是“工厂”一词的错误用法。在工厂模式中,XxxxFactory 创建了Xxxx 的实例,如果需要则初始化它们,但不应用其他类型的逻辑。

这里的设计对我来说似乎是正确的,但你的班级宁愿被称为ReportsService

也许UserPermissionsChecker 会是AuthorizationService

编辑:考虑对“服务”一词的批评。

目前在 java 世界中有一个相当普遍(我没有说通用)的约定,其中包括:

  • 一种纯粹的描述性业务模型,由清空所有逻辑的类实现,称为(可能是错误的)POJO
  • 所有业务逻辑主要与一个对象 Xxx 相关,该对象 Xxx 在名为 XxxService 的类的方法中以过程方式实现。

我个人不同意这种编码风格,我更喜欢 object oriented programming,但不管我们喜不喜欢,这约定存在于 Java EE 世界中并且具有一致性。

从 OP 提交的类的编码风格来看,我推断他遵循了这种程序方法。在这种情况下,最好遵循现有约定并调用用作处理 Reports 和 ReportService 的过程代码容器的类。

【讨论】:

  • 所以为了证明工厂使用的合理性,我可以将 Set 封装成说 AvailableReports,然后我会有 AvailableReportsFactory?我说的对吗?
  • 我不相信将所有东西都称为“服务”会更好。这是一个非常模糊的词,几乎不比“经理”或“对象”好。使用领域语言中的单词可能会更好。例如。 hasAccessTo() 报告的不是权限检查器,也不是 AuthorizationService。这是具有访问权限的User。也许User 应该有那个方法?
  • 这有点棘手,因为我需要某种后端 ekhm...“服务”来获取每个请求的用户权限。由于用户是简单的 pojo,我无法访问此服务。我可以有方法让用户将权限服务作为第二个参数,但我想它更糟。
  • @aetheria 同意,我编辑了我的答案以考虑您的观点。
  • >*而且我更喜欢面向对象的编程* - 你描述的风格仍然是 OOP。在正常的世界里,你会要求蛋糕自己烤吗?请参阅此参考以获得比此处更详尽的解释:theserverside.com/discussions/thread.tss?thread_id=61669#342766
【解决方案2】:

对我来说,这看起来有点像builder 模式,从某种意义上说,你有一个对象,你可以在其中构建它的数据。
这与工厂相反,工厂通常返回不同的具体类型的创建对象,
并且通常这些对象的数据构造是在具体类的CTOR中完成的,它们的对象是从工厂返回的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多