http://m.biancheng.net/design_pattern/