I think this is a very positive sign of your skills. It is far more common for people who have difficulty coming up with the 'better' design in a team to be completely incapable of recognizing why another design is better.
You have two really great (and surprisingly uncommon) strengths going for you:
- You are capable of assessing your designs against others objectively
- You have the desire and put forth effort to make your designs optimal
You're only a couple years in and have a long way to go, but with this attitude you will definitely get there, just don't give up; we all deal with mental set backs like this. As often as I get a chance I like to plug Design Principles (NOT the same as design patterns) and I think this is a perfect example of where they come in handy. Study them and practice applying them in your designs, you will before you know it have taken another step forward in this regard.
At the end of the day remember, designing is hard. We're dealing with complex high level abstractions every day, to create these from thin air, have them work well, and easy to use by colleagues is an extremely difficult task. It takes practice, for years.
So chin up and just remember: there's a bunch of folks out there who can't assess two designs and actually recognize one as preferable over another, how well do you think they're getting along in creating good designs?
Edit:
'nother tip, after getting your head around principles and practicing their application a bit, I think there is another gem from another question here speaking to the value of studying a variety of languages which have different purposes and rules:
Ideally, every programmer should know a language from each class. What could you learn:
- A static typed OOP mainstream language: Java, C# (mostly used in enterprise software) and C++ (system programming and complex desktop applications)
- A prototype-based OOP language: Javascript (client side web programming)
- A procedural language: C (embedded software and system programming)
- A functional language: Haskell, ML or Lisp (functional languages are good for highly parallelized software).
A logic programming language (Prolog) probably is not that useful in industry, being used mostly in research in AI.
This will help to broaden the variety of ideas that come to mind when trying to design a solution.