[c#] When to use which design pattern?