【问题标题】:Is it wise to have a static method be responsible for creating the object of the class it resides in? [duplicate]让一个静态方法负责创建它所在的类的对象是否明智? [复制]
【发布时间】:2019-01-17 15:44:46
【问题描述】:

我最近遇到了这种类型的代码:

final class OnlyMe {
 private int a;
 private int b;

 //setter and getters for a and b.

 private OnlyMe(){}

 public static OnlyMe getOnlyMeObj(int c) {
 // use c value to connect to database
 // to populate a and b     
 if(rs.next()) {
  OnlyMe onlyMe = new OnlyMe();
  onlyMe.a = rs.getInt(1);
  onlyMe.b = rs.getInt(2);

  return onlyMe;
 } 

 // return null for everything else.
 // assume the code is under try-catch block.
 return null;
}

因此,似乎可以将“getOnlyMeObj(int)”提取到另一个类中。但似乎开发人员希望这个类仅由该方法创建,具体取决于该方法的输入。

这是什么原因?

这是某种类型的模式或反模式还是没有模式?

有没有更好的解决方案?

【问题讨论】:

  • 它被称为静态工厂方法
  • 这是一个静态工厂方法。私有构造函数迫使您依赖该方法,以便您获得已经设置了所有值的实例(来自数据库)。
  • 感谢您的链接。我还阅读了this link 的答案。但是对于这种情况有更好的解决方案吗?

标签: java design-patterns


【解决方案1】:

这是一种静态工厂模式。这个想法是通过静态(类级别)方法创建对象的实例并将其返回。这种模式有几种可能的用途:

  • 可能有多个可能的构造函数,您可能希望避免让需要新实例的代码选择构造函数
  • 如果有多个工厂,可以通过命名来减少混淆
  • 这样您就可以选择验证某些参数并仅在它们有效时才实例化
  • 您可以拥有工厂,这可能会返回子类,这不一定是最好的选择,但仍然是一种选择

见:见:https://www.youtube.com/watch?v=sOpbAOX5nJs

【讨论】:

  • 谢谢,这回答了我的问题。我还找到了您第二点的示例here
  • @Harke 很高兴您的问题得到了解决。例子也不错。
  • 静态工厂模式和静态工厂方法一样吗?
  • @Harke 工厂方法是实际方法,模式是使用这些方法的策略。
【解决方案2】:

这看起来像Factory method pattern,但实施得不太好。您也可以使用Abstract factory pattern。需要更多上下文才能获得最佳选择。您还可以检查您的项目中是否存在类似的问题以及如何解决该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2012-04-26
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多