https://jingling.im/posts/prototype-design-pattern/