Actually, I'd suggest a combination of the two.
In games like WoW, there are millions of characters, and many duplicates of many different classes. In that case, you never want to describe a character class more than once and there's no need to allow multiple instancing of description data.
So, you define once, and only once, a base class for your character Class and each inherited version (eg. Warrior, Druid). These classes are only accessed through a factory to ensure that character classes (henceforth called CC so as not to confuse with programming classes) that don't exist or require unlocking cannot be assigned.
Also, you define individual factories for skills, abilities, animations, etc. These also need only be described once. Here you can get a little fancy with your specific game data because skills and abilities are going to need to manipulate characters and enemies alike, so be very thoughtful for how you separate character's from their statistics so they can possibly share this with enemies and monsters.
Now the fun part! Usually through scripting (but there are other means such as coded macros), you set a list of skills, abilities, animations, etc. that are contained within each CC. Every CC should load this dynamically and contain their own references to each ability they contain. The reason this is done this way is for editing. You'd be surprised how often beta testing, MOD development, and expansions will drastically change how you'd like your abilities to be spread out. In one version, the Warrior is the only CC with Double Strike, but low and behold, an expansion comes out and suddenly the Paladin wants some of that action too. There's only one static instance of the Double Strike ability, but both CC classes will contain in their dynamic list a reference to it, so that they can both make use of it's description and effects.
Now all you need is to assign each character their class reference. When the HUD needs to show all of your abilities, simply do a character->class->EnumerateAbilities(string &szAbilityList), which returns to you the list of the character's abilities (or have even MORE fun with having each ability containing icons instead of string output).
Now, in this example, let's say a CC adds data to a character that needs supported, such as a character class that gains "charges" from their abilities (think Rogue from WoW). This is where you use decorators for your abilities, and every assignment of a CC to a character should enumerate all decorators and instantiate accordingly.
This is just one idea, give or take as I'm sure it's not perfect, but it's very similar to the architecture that's been used in many older games of a similar type (eg. Neverwinter Nights).