Шаблон «Создатель» для настройки унаследованных объектов - PullRequest
0 голосов
/ 21 ноября 2018

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

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;
    }
}

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

Спасибо!

1 Ответ

0 голосов
/ 21 ноября 2018

что вы думаете по этому поводу:

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
           );
    }
} 
...