http://www.nulab.co.jp/designPatterns/designPatterns2/designPatterns2-2.html