abstract producer class