I think the reason me and @bakura10 only discussed using factories as we did was because we thought an abstract factory would cause performance issues.

This is what an abstract factory would look like: https://gist.github.com/macnibblet/c425e9c570ef4deda975