In this case I've got a fairly heavy emphasis on using names to build stuff from a factory, eg: (psedo code)
e = EnemyFactory.create(config.enemyName)
w = weapons.find(config.weaponName)
w = WeaponFactory.create(config.weaponType)
What this leaves me with is a way of defining radically different configs, all hidden away inside the factories and created by just using the appropriate name string. This leaves the actual in-game code to just worry about *when* to create stuff, not how.
Its all very hardcoded for now, but eventually these configs will be pulled from xml files or similar. The factories themselves will probably also use xml to define variations on the major types provided.