2012-07-02 3 views
0

Я собираюсь внедрить шаблон фабрики в java. У меня есть карта типа HashMap на заводе, где я бы добавил все конкретные реализации с помощью ключа по своему выбору. Ключ определяется абстрактным методом getImplName() в кластере MyAbstract.Custom Factory Pattern Implementation

Мое требование - когда кто-то расширяет MyAbstractClass и определяет getImplName(), пара значений ключа должна автоматически добавляться на заводскую карту вместо кода, который это делает вручную. Это возможно ? Я думал использовать пользовательские аннотации. Дайте мне знать ваши предложения

+0

Нет, не совсем так, как вы его описываете. Вы не можете заставить подклассы что-либо делать. Возможно, вам повезет с инъекцией зависимостей или чем-то еще, кроме фабрики. –

ответ

2

В конструкторе вашего абстрактного класса вы должны иметь возможность вызвать getImplName() и добавить его на свою карту (при условии, что есть один известный экземпляр вашей карты, иначе это необходимо будет передать) ,

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

0

Существует дискуссия о том, должны ли фабричные элементы распознавать фабричный метод.
я рекомендовал бы на следующий подход, если вы хотите, чтобы ваши элементы признать завод:

public abstract class MyAbstractClass { 
    public MyAbstractClass(MyFactory factory) { 
     factory.addElement(getImplName(),this); 
    } 

    public abstract String getImplName(); 
} 

public class MyTestClass extends MyAbstractClass { 
    public MyTestClass(MyFactory factory) { 
    super(factory); 
    } 
} 

Где MyFactory фабрика, которая имеет HashMap как внутреннее поле
Таким образом, программист, который расширяет MyAbstractClass принудительно для предоставления CTOR, который, вызывая суперкласс CTOR, добавит объект класса к фабрике.