2010-12-14 1 views
3

Это еще один шаблон дизайна в некотором устаревшем коде, который я не мог найти в Google. В этом случае дочерний класс расширяет абстрактный родитель, а затем поворачивает направо вокруг и объявляет статический экземпляр родителя:Когда и почему класс Child объявляет статический член экземпляра родительского класса?

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. Кажется, я работаю с большим количеством интересных designpatterns в этом устаревшем коде, который я не знаю, как обращаться. Спасибо всем, кто уже помог мне.

Редактировать: Расширение образца кода. Будет снова редактировать, поскольку я обнаруживаю место, которое фактически использует этот код. Yay без документации.

+1

Как используется переменная экземпляра? – Ralph

ответ

3

Это распространенная идиома для нитевидной ленивой инициализации синглтона. Если вы можете иметь одноэлементный класс, вы делегируете его частному статическому классу экземпляров.

public class MySingleton{ 

    private MySingleton(){ 

    } 

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

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

Не уверен, если это то, как используется ваш класс ребенка, но это будет случай использования для дочернего класса держит статический экземпляр своего родителя

+0

+1: Объяснение имеет смысл, за исключением того, что вы используете композицию, а не наследование для своего примера. Я предполагаю, что это не приводит к недействительности рассуждений. Я буду распространять пример кода, который я включил, чтобы увидеть, изменит ли этот ответ вообще. Благодаря! – Riggy

0

Первоначальное намерение, вероятно, было то, что для каждого подкласс MessageBase должен быть только 1 экземпляр и что вы можете получить доступ к этому экземпляру с Коммон метода в базовом классе

, чтобы вы могли перебрать все типы сообщений и получить экземпляр каждого

мои 2cents