The book that I would recommend is Martin Fowler's "Refactoring" book. That may seem strange but it's the book that helped me shape my views about design, helped me develop a sensitivity to bad code and design smells, and helped me realize what object orientation is really about: it's about assigning behaviors and responsibilities to the appropriate abstractions in our programs. Head on over to the Design Forum and follow along in some of the longer threads there where we discuss about designs of some sample applications.
Knowing about
design principles like SOLID, DRY, and SLAP will give you a strong foundation. Robert Martin's "Agile Software Development : Principles, Patterns, and Practices" is a great reference.
Craig Larman has GRASP, General Responsibility Assignment Software Patterns (or Principles). Larman's books are also good and he has a lot to teach about design. Lastly, I will circle back to refactoring and recommend Joshua Kerievsky's "Refactoring to Patterns" book. This combines refactoring and design patterns and I find myself referring to this book often in the course of my daily work.
IMO, the best way to get a lot of practice in good design is learning how to do proper Test-Driven Development. Despite its name, TDD is really more about design than it is about
testing. Design thinking and refactoring are very closely intertwined and TDD forces you to think about and do these things every step of the way.