C# Design Patterns 101