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这很好。所以为了证明工厂使用的合理性,我可以封装这个集合