visitor and prototype patten