Abstract Factory Pattern
Abstract Factory pattern is used when you want to create families of products. It relies on composition so methods exposed in factory interface are responsible for the creation of objects.
Abstract Factory Pattern Example
Here is an example of a Abstract Factory pattern with 2 families of products.
// Abstract Factory abstract class MobileFactory { public abstract SimpleMobile CreateSimpleMobile(); public abstract AdvancedMobile CreateAdvancedMobile(); } //ConcreteFactoryOne class SamsungMobileFactory : MobileFactory { // CreateProductX public override SimpleMobile CreateSimpleMobile() { return new SamsungSimpleMobile(); } // CreateProductY public override AdvancedMobile CreateAdvancedMobile() { return new SamsungAdvancedMobile(); } } //ConcreteFactoryTwo class HTCMobileFactory : MobileFactory { // CreateProductX public override SimpleMobile CreateSimpleMobile() { return new HTCSimpleMobile(); } // CreateProductY public override AdvancedMobile CreateAdvancedMobile() { return new HTCAdvancedMobile(); } } // AbstractProductX abstract class SimpleMobile { } // AbstractProductY abstract class AdvancedMobile { } // ProductXOne class SamsungSimpleMobile : SimpleMobile { } // ProductYOne class SamsungAdvancedMobile : AdvancedMobile { } // ProductXTwo class HTCSimpleMobile : SimpleMobile { } // ProductYTwo class HTCAdvancedMobile : AdvancedMobile { } class Client { private SimpleMobile _abstractProductX; private AdvancedMobile _abstractProductY; public Client(MobileFactory factory) { _abstractProductX = factory.CreateSimpleMobile(); _abstractProductY = factory.CreateAdvancedMobile(); } public void Print() { Console.WriteLine(this._abstractProductX.ToString() + " Created!"); Console.WriteLine(this._abstractProductY.ToString() + " Created!"); } }
class Program { static void Main(string[] args) { MobileFactory abstractFactoryOne = new SamsungMobileFactory(); Client client1 = new Client(abstractFactoryOne); client1.Print(); MobileFactory abstractFactoryTwo = new HTCMobileFactory(); Client client2 = new Client(abstractFactoryTwo); client2.Print(); Console.ReadKey(); } }