Comment
Declares a IGUIFactory (UserControl) as a new object and renders button according to local machine config settings. IGUIFactory creates button whilst IButton renders control, both work in tandem with the IGUIFactory being instantiated based on the config with either derived (concrete) classes (OSX/Win)
Code
interface IButton { void Paint(); } interface IGUIFactory { IButton CreateButton(); } class WinFactory : IGUIFactory { public IButton CreateButton() { return new WinButton(); } } class OSXFactory : IGUIFactory { public IButton CreateButton() { return new OSXButton(); } } class WinButton : IButton { public void Paint() { //Render a button in a Windows style } } class OSXButton : IButton { public void Paint() { //Render a button in a Mac OS X style } } class Program { static void Main() { var appearance = Settings.Appearance; IGUIFactory factory; switch (appearance) { case Appearance.Win: factory = new WinFactory(); break; case Appearance.OSX: factory = new OSXFactory(); break; default: throw new System.NotImplementedException(); } var button = factory.CreateButton(); button.Paint(); } }