(1) you are still young and learning
(2) you should broaden your toolset (patterns) and sounds like you are already doing this, good job!
(3) with time, you will become better because you have more options to select as the best option given the context
(4) all software seems to experience the curse of complexity, it's hard to keep it simple once you have to deal with the real world and all the edge cases that it presents
Sounds like you are doing the things you need to be doing and just need to keep at it.
---
edit, one strategy you may consider is to solve the same problem (program the same thing) with different languages, technologies, and patterns. After, try the same thing on something else. This will give you a breadth of contexts
another strategy is to work on the same project for a long time. This will uncover problems you only reach when a project becomes sufficiently mature. Often you will need to rewrite, refactor, and swap out technologies or patterns.