Hello,
i would do something similar to the first approach. Let every npc be a "creature" (maybe keep npc, but i like to handle every living object the same, incuding the player) and create templates for specific ones. After creation you just have to create a clone.
E.g.
Templates.Add( new Creature("orc",100,10,10));
Templates.Add( new Creature("elf",50,40,40));
........
Creature concreteOne = CreatureFactory.Create("elf"); => this would do a lookup and create a copy.
maybe:
Creature.Clone()
{
return new Creature(this.health, this......);
}
If you really want to have different classes for different NPCs, you should try the factory pattern. Basically each specific creature has a factory which instantiates the proper object.
e.g.
ICreature = CreatureFactory.Create("elf");
Now the creature factory has 10 concrete factories registered and create the proper object. Maybe use the chain of responsible pattern to check if the factory can handle the request.
BanditFactory : ICreatureFactory {
bool CanHandle(string request) {
return request == "bandit";
}
ICreature Create() {
return new Bandit();
}
}
Bandit : ICreature {
...
}
Just some thoughts