AbstractFactory is done
FactoryMethod TODO