add lazy singleton pattern and and generic singleton pattern