Зачем использовать в качестве типа переменной интерфейс?
Почитайте про инъекцию зависимостей.
Интерфейс дает возможность использовать все реализующие его классы без изменения кода класса, где используются подклассы этого интерфейса (звучит криво, но вчитайтесь :) )
А суть паттернов в двух словах - свести к минимуму кол-во изменений существующего кода при добавлении новой функциональности.
Еще про SOLID принципы почитайте, тоже будет полезно.
Пример: List -> ArrayList, LinkedList
Если тебе нужна просто коллекция с методами, описанными в интерфейсе, и не важна реализация этой коллекции, то нужно использовать в качестве типа переменной интерфейс List. Это сбережет время и нервы в будущем, если придется поменять реализацию с ArrayList на LinkedList - не придется менять по всей программе ArrayList на LinkedList и можешь быть уверенным, что программа продолжит работать корректно.
Если нужны специфические методы конкретной реализации, то нужно использовать ее.