Understanding the Abstract Factory Pattern in C#