Abastract factory pattern