add singleton pattern
add observable pattern