incorporate abstract part of factory method