added interface, abstract, singleton and factory