add prototype pattern
add singleton pattern