Learning how to design high-quality software takes a lot of time. It is necessary to gain experience by making good and decisions and seeing the consequences.
While nothing can really replace making own experiences, there certainly are ways to teach and learn design to some extent. It is possible to learn from others who have already made certain experiences. One possibility to do so, is by studying principles and principle languages.
A first step to learn design is to get to know the important aspects which need consideration while designing software. These aspects are codified in principles.
When it is clear which aspects can be considered, it is still necessary to learn which aspects are relevant for which design decisions. Principle languages interconnect principles in a way that lets you easily find the relevant aspects for a certain design scenario.
When you want to learn object-oriented design, first get to know the 19 principles in the OOD Principle Languages. It is not necessary to learn every detail by heart—details can be looked up in the wiki—but a designer should know these aspects. Secondly get to know the principle language and how certain aspects influence each other. Also the principle language doesn't have to be known by heart and can be looked up (maybe you want to print it out, make a poster, etc.). Over the time you'll get acquainted with all these principles and you will not need to look up all the aspects anymore.