Шаблон "Создатель" для настройки унаследованных объектов

У меня следующая структура объекта:

class Annotation;
class LabelAnnotation: inherits Annotation;
class TextAnnotation: inherits LabelAnnotation;

Я хотел бы использовать объекты-создатели, чтобы выполнить некоторую инициализацию этих объектов (эта инициализация зависит от внешних настроек, поэтому я не хочу делать это в конструкторе этих объектов).

В частности, при создании LabelAnnotation я хотел бы сделать:

fontSize = AppDefaults.fontSize

Итак, пишу «создателю»:

class LabelAnnotationCreator {
    LabelAnnotation create() {
        annotation = LabelAnnotation()
        annotation.fontSize = AppDefaults.fontSize
        return annotation;
    }
}

Теперь я хотел бы создать TextAnnotationCreator. Вот где я застрял: я не могу использовать LabelAnnotationCreator, потому что он создаст экземпляр LabelAnnotation, но, с другой стороны, я хочу извлечь выгоду из инициализации, выполняемой LabelAnnotationCreator.

class TextAnnotationCreator {
    TextAnnotation create() {
        annotation = TextAnnotation()
        // I'm stuck here:
        // can't do LabelAnnotationCreator().create()… ???
        return annotation;
    }
}

Очевидно, это неправильный шаблон, но я не уверен, как найти правильный.

Спасибо!

Что вы хотите получить от инициализации объекта LabelAnnotationCreator?

Maksym Fedorov 21.11.2018 12:41

annotation.fontSize = AppDefaults.fontSize

Kamchatka 21.11.2018 12:42

имеют ли оба класса TextAnnotationCreator и LavelAnnotationCreator свойство fontSize?

Maksym Fedorov 21.11.2018 12:45

Свойство fontSize находится не в классе создателя, а в классе LabelAnnotation. Класс TextAnnotation также имеет это, потому что он наследует класс LabelAnnotation.

Kamchatka 21.11.2018 13:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
41
1

Ответы 1

что ты думаешь об этом:

class TextAnnotation {
    private final int someOtherArgs;
    private final int fontSize;

    public TextAnnotation(LabelAnnotation labelAnnotation, int someOtherArgs) {
        this(someOtherArgs, labelAnnotation.getFontSize());
    }

    public TextAnnotation(int someOtherArgs, int fontSize) {
        this.someOtherArgs= someOtherArgs;
        this.fontSize = fontSize;
    }
}

создать конструктор на TextAnnotation, который строит объект из конфигурации LabelAnnotation. Тогда вы можете использовать это так:

TextAnnotation text = new TextAnnotation(someArgs,fontSize);

или используя вашего создателя

class TextAnnotationCreator {
    TextAnnotation create() {
        return 
           new TextAnnotation(
               new LabelAnnotationCreator().create(),
               someOtherArgs
           );
    }
} 

Эти декораторы действительно элегантны, но, к сожалению, мне нужны LabelAnnotation и TextAnnotation как конкретные типы.

Kamchatka 22.11.2018 14:53

Я изменил свой ответ. Теперь я предлагаю использовать конструктор, который строит объект из другой конфигурации объекта.

elbraulio 22.11.2018 15:13

Другие вопросы по теме