Common software design patterns in C#