This solution contains some design pattern examples...