abstractFactory v2
abstractFactory v3