finished simply factory pattern