Added an Abstract Factory ... So I also re-factored, moved classes, renamed, etc...