Source: http://carfield.com.hk/document/software+design/pattern+201.pdf