Какие книги или где можно почитать как строить структуру приложения?
Кароч, советую книгу одну, но сразу предупреждаю, она ооочень сложная и в метро или в туалете ее не почитаешь, если хочется усвоить материал. Даже хочу сказать больше, некоторые люди так и не смогли осилить ее… так вот, книга называется "Хватит сидеть на тостере и задавать вопросы ! Иди и пиши код блеать"
P.S. сейчас придут разные люди и начнут советовать разных Фаулеров, Паттерны проектирования, Элементарные шаблоны проектирования, Макконнелла, Мартина… безусловно это хорошие книги, но без опыта промышленного программирования это все так … от лукавого, то есть какой то прирост в знаниях будет, но все равно это не то… (но прочесть все же их стоит, а Макконнелла, так перечитывать хорошо бы)
P.P.S.  устройся на работу
Проектирование приложения процесс мало того что сложный, неочевидный, так он ещё и не делается по книжкам. Он делается по опыту.
Второй факт, который не стоит забывать - архитектура пишется под приложение, т.е. пока у вас два класса и одна вьюшка, вам не нужна архитектура. А в процессе роста приложения будет нарабатываться опыт, выявляться слабые места, прочая и прочая. В итоге, после 2-3 более менее серьезных приложений вы сможете для себя сформировать основные признаки неплохой архитектуры.как правильно и где использовать интерфейсы, абстрактные классы и прочее ООП? 
Имхо:
1. Интерфейсы можно использовать везде где хочется. Интерфейсы нужно использовать там, где планируется расширение\возможность замены модулей и тп
2. Абстрактный класс отличается только тем, что его нельзя создать. Оно вам надо в таком виде? Делаете обычный класс, в какой то момент нужно расшить его на разные классы? Делаете абстрактным, пилите наследников, поднимаете компилируемость.
3. Прочее ООП там, где вам не нравится ваш же код =)