Design pattern for RPG skills (good, bad, horrible?)

My RPG has Skills in it like “Fireball”, “Heal” etc. Until yesterday, I did a straight forward approach of every Fighter entity (i.e. enemies and heroes) having a List of Skills and every List consisting of instances of “Fireball” and so on, so if I have a hundred Fighters who have learned Fireball, I will have a hundred Fireball objects.

I realized that all those FireballSkill objects are virtually the same, except for one field, “level” so now I had the idea of only creating one “FireballSkill”, one “HealSkill”… and instead give the Fighters a class “LearnedSkill” (name pending…) which has but the field’s name, level and Skill. So if a Hero has a “LearnedSkill fireball (FireballSkill, level 3)” and does an attack with it, the LearnedSkill will tell FireballSkill to do whatever it does at level 3 via fireball.runSkill(3, targetFighter) or similar.

To me, that seems neater but I really don’t know if saving memory space outweighs the need for referencing to the “MotherSkill” with every skill use?

Does this make sense? I think this question will teach me some general understanding as well.
I won’t save on the number of objects needed (in fact it’s the old number +1 lol), but the object sizes are much smaller, LearnedSkill has 3 fields while FireballSkill has its own “evolution” inside, i.e. level 5 doesn’t only mean damage goes up by lvl*x but it can also change targeting at level 10, throw 3 fireballs at level 15 and so on.

Another idea I just had (just writing it down without thinking about it, I need to leave), maybe let everyone have their own FireballSkill, but have all FireballSkills reference the same FireballEvolutionRoadmap? Then if a FireballSkill gets leveled up, it will get its leveling instructions from its roadmap via fireball.setLevel(3)? This still leaves me with the same number of objects but now at least they are reasonably different. The objects are still much bigger than LearnedSkills, but smaller than the old FireBallSkill. There would still be a lot of redundant code stored in those objects though, even at different skill levels, like 80% of each FireballSkill’s fields would still always stay the same.

If the differences are small but existing, I’d still want to do the more optimal way since this is primarily a learning experience.