One thing I might be wary of when using the whole
Physics* p = entity.getComponent<Physics*>( ComponentID::PHYSICS );
idea is that it restricts you to one of each component. Certainly you wouldn't need multiple physics or graphics components but some other component types there might be situations when you need this functionality.
You want to create a tank with two cannons:
GameObject* go = factory->NewGameObject(); go->AddComponent(new Cannon()); go->AddComponent(new Cannon()); go->AddComponent(new Animation()); // etc Canon* canon = go->GetComponent<Canon*>(); // ??
the above could be a problem.