Хитрость заключается в том, чтобы понять, что вы не «создаете», «создаете экземпляр» или «инициализируете» интерфейс. Вы просто определяете переменную как нечто, что, как вы знаете, реализует этот интерфейс.
Вы, по сути, говорите другим программистам, работающим над этим кодом, что для остальной части этого метода вас интересует только тот факт, что myDoc
- это Doc
(то есть то, что удовлетворяет интерфейсу Doc
). Это может упростить программирование, потому что автозаполнение в IDE теперь будет показывать только методы, определенные этим интерфейсом, а не все, на что способен SimpleDoc
.
Представьте себе, что в будущем вы захотите расширить свои функциональные возможности, чтобы у вас могли быть разные реализации Doc в зависимости от некоторого ввода. Вместо явного создания SimpleDoc вы говорите:
Doc mydoc = docFactory.getByType(inputType);
docFactory
может производить любой тип Doc
, и этот метод на самом деле не заботится о том, какой тип создается, потому что он будет обрабатывать его как Doc
независимо.