Factory Method Pattern