https://www6.software.ibm.com/developerworks/cn/education/java/j-patterns201/tutorial/j-patterns201-3-1.html