何时以及为什么Child类声明父类的静态实例成员?

时间:2010-12-14 20:55:27

标签: java design-patterns refactoring legacy-code

这是一些遗留代码中的另一种设计模式,我在谷歌上找不到多少。在这种情况下,子类扩展其抽象父级,但然后右转并声明父级的静态实例:

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
}

我不确定我是否理解将驱动此设计模式的原因(如果它是已知模式)。这是一种方便模式,以避免将父级的每个成员变量声明为静态吗?或者它是否意味着允许多个子类每个都有一个父实例。但是,如果是这样的话,为什么过度使用继承只是简单的组合?

其余代码没有说明为什么会这样做。任何想法或想法将不胜感激。谢谢!

P.S。我似乎在这个我不知道如何处理的遗留代码中遇到了很多有趣的design patterns。感谢所有帮助过我的人。

编辑:扩展代码示例。当我发现实际使用此代码的地方时,将再次编辑。是的没有文件。

2 个答案:

答案 0 :(得分: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 :(得分:0)

最初的意图可能是,对于MessageBase的每个子类,应该只有1个实例,并且您可以使用基类中的commom方法访问该实例

因此您可以迭代所有消息类型并获取每个

的实例

我的2cents