practice TemplateMethod pattern
practice FactoryMethod pattern
Singleton pattern