什么时候和为什么子类会声明父类的静态实例成员?

3
这是一种遗留代码中的另一种设计模式,我在谷歌上找不到太多相关信息。在这种情况下,子类继承其抽象父类,但紧接着又声明了一个父类的静态实例。
public abstract class MessageBase {
    protected DAOFactory factory;
    // method declarations
}

public class EDWMessage extends MessageBase {
    private static MessageBase instance;

    public static MessageBase getInstance(Properties properties) {
        if (instance == null) {
            instance = new EDWMessageTransaction(properties, null);
        }
        return instance;
    }
//more code
}

我不确定是什么推动了这个设计模式(如果它是一个已知的模式)。这是一种方便的模式,避免将父类每个成员变量声明为静态变量吗?还是允许多个子类每个拥有一个父类实例。但如果是这样,为什么要过度使用继承而不是普通的组合呢?
代码的其余部分没有任何迹象表明为什么要以这种方式完成。任何想法或建议都将不胜感激。谢谢!
附言:我似乎在遇到很多有趣的设计模式在这个老旧的代码中,我不知道如何处理。感谢所有帮助过我的人。
编辑:扩展代码示例。将根据我发现使用此代码的某些地方进行编辑。好的,没有文档。

1
实例变量怎么使用? - Ralph
2个回答

3
这是一种线程安全的懒加载单例初始化的常见说法。如果你可以拥有一个单例类,那么你就将其委托给一个私有的静态实例化类。
public class MySingleton{

   private MySingleton(){

   }

   public static MySingleton getInstance(){
       return SingletonCreator.INSTANCE;
   }

   private static class SingletonCreator{
     private static final MySingleton INSTNACE = new MySingleton();
   }
}

不确定您的子类是否是这样使用的,但这将是一个子类持有其父类静态实例的用例。


+1:解释有些道理,只是你的例子中使用的是组合而不是继承。我想这并不会使推理无效。我将扩展我包含的示例代码,看看是否会改变答案。谢谢! - Riggy

0

最初的意图可能是对于MessageBase的每个子类,应该只有一个实例,并且可以通过基类中的公共方法访问该实例

因此,您可以遍历所有消息类型并获取每个实例

我的看法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接