Add Abstract factory implementation