Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是工厂模式的正确用法吗?_Java_Design Patterns_Factory Pattern - Fatal编程技术网

Java 这是工厂模式的正确用法吗?

Java 这是工厂模式的正确用法吗?,java,design-patterns,factory-pattern,Java,Design Patterns,Factory Pattern,有设计问题,也许你可以帮我决定 我的客户端对象可以请求类报告的对象集。有一组已定义的可用报告,根据客户的权限,返回的报告集中可以包含不同的报告。每个请求都会创建报告(每个客户端在每个请求上都会获得全新的报告实例) 我是否应该使用一种“工厂”来封装报告创建,如下所示: public class ReportsFactory { private UserPermissionsChecker permissionsChecker; public Set<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() {...}
}
公共类报表工厂{
私人用户许可证;
公共集合createReports(){
Set reports=newhashset();
if(permissionsChecker.hasAccessTo('report A')){
reports.add(createReportA());
}
if(permissionsChecker.hasAccessTo('report B')){
reports.add(createReportB());
}
if(permissionsChecker.hasAccessTo('report C')){
reports.add(createReportC());
}
返回报告;
}
私有报表createReportA(){…}
私有报表createReportB(){…}
私有报表createReportC(){…}
}
这就是所谓的简单工厂模式的正确用法吗?或者你还有其他建议吗

**编辑**


下面的一些评论说这不完全是工厂模式。如果不是,我怎么能这样称呼呢?

我认为设计是正确的,但这是“工厂”一词的错误用法。在工厂模式中,
XxxxFactory
创建
Xxxx
的实例,必要时对其进行初始化,但不应用其他类型的逻辑

这里的设计对我来说似乎是正确的,但您的类更愿意被称为
ReportsService

也许
UserPermissionsChecker
将是
AuthorizationService

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

java世界目前有一个相当广泛的(我没有说是通用的)约定,它包括:

  • 一个纯粹的描述性业务模型,由清空所有逻辑的类实现,称为(可能错误地)POJO
  • 所有业务逻辑主要与对象Xxx相关,对象Xxx以过程式方式在名为XxxService的类的方法中实现
我个人不同意这种编码风格,我更喜欢,但不管我们喜欢与否,这种约定存在于JavaEE世界中,具有一致性


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

我认为设计是正确的,但这是“工厂”一词的错误用法。在工厂模式中,
XxxxFactory
创建
Xxxx
的实例,必要时对其进行初始化,但不应用其他类型的逻辑

这里的设计对我来说似乎是正确的,但您的类更愿意被称为
ReportsService

也许
UserPermissionsChecker
将是
AuthorizationService

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

java世界目前有一个相当广泛的(我没有说是通用的)约定,它包括:

  • 一个纯粹的描述性业务模型,由清空所有逻辑的类实现,称为(可能错误地)POJO
  • 所有业务逻辑主要与对象Xxx相关,对象Xxx以过程式方式在名为XxxService的类的方法中实现
我个人不同意这种编码风格,我更喜欢,但不管我们喜欢与否,这种约定存在于JavaEE世界中,具有一致性


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

在我看来,这看起来有点像一种模式,从某种意义上说,您有一个对象,可以将其数据构建到该对象
这与工厂不同,工厂通常返回不同类型的创建对象,

通常,这些对象的数据构造是在从工厂返回的具体类的构造函数中完成的

对我来说,这看起来有点像一种模式,从某种意义上说,您有一个对象,您可以将其数据构建到该对象
这与工厂不同,工厂通常返回不同类型的创建对象,

通常,这些对象的数据构造是在从工厂返回的具体类的构造函数中完成的

我看不出这有什么问题。你怀疑你的方法有什么具体的原因吗?那些重复的“如果”部分有相同的模式:如果有标题,那么就创建。我想知道是否有更好的方法来封装它,例如遵循“告诉-不要问”原则。但我认为这可能过于工程化了。如果这些
是内部包含的。如果您添加了对更多报表的支持,则无需更改其他代码。我觉得这很好,我看这没什么问题。你怀疑你的方法有什么具体的原因吗?那些重复的“如果”部分有相同的模式:如果有标题,那么就创建。我想知道是否有更好的方法来封装它,例如遵循“告诉-不要问”原则。但我认为这可能过于工程化了。如果这些
是内部包含的。如果您添加了对更多报表的支持,则无需更改其他代码。所以imho这很好。所以为了证明工厂使用的合理性,我可以封装这个集合