using System; namespace AbstractFactoryPattern { // Abstract Factory D-J Miller and Judith Bishop Sept 2007 // Uses generics to simplify the creation of factories interface IFactory<Brand> where Brand : IBrand { IBag CreateBag(); IShoes CreateShoes(); } // Conctete Factories (both in the same one) class Factory<Brand> : IFactory<Brand> where Brand : IBrand, new() { public IBag CreateBag() { return new Bag<Brand>(); } public IShoes CreateShoes() { return new Shoes<Brand>(); } } // Product 1 interface IBag { string Material { get; } } // Product 2 interface IShoes { int Price { get; } } // Concrete Product 1 class Bag<Brand> : IBag where Brand : IBrand, new() { private Brand myBrand; public Bag() { myBrand = new Brand(); } public string Material { get { return myBrand.Material; } } } // Concrete Product 2 class Shoes<Brand> : IShoes where Brand : IBrand, new() { private Brand myBrand; public Shoes() { myBrand = new Brand(); } public int Price { get { return myBrand.Price; } } } interface IBrand { int Price { get; } string Material { get; } } class Gucci : IBrand { public int Price { get { return 1000; } } public string Material { get { return "Crocodile skin"; } } } class Poochy : IBrand { public int Price { get { return new Gucci().Price / 3; } } public string Material { get { return "Plastic"; } } } class Groundcover : IBrand { public int Price { get { return 2000; } } public string Material { get { return "South african leather"; } } } class Client<Brand> where Brand : IBrand, new() { public void ClientMain() { //IFactory<Brand> factory) IFactory<Brand> factory = new Factory<Brand>(); IBag bag = factory.CreateBag(); IShoes shoes = factory.CreateShoes(); Console.WriteLine("I bought a Bag which is made from " + bag.Material); Console.WriteLine("I bought some shoes which cost " + shoes.Price); } } static class Program { static void Main() { // Call Client twice new Client<Poochy>().ClientMain(); new Client<Gucci>().ClientMain(); new Client<Groundcover>().ClientMain(); } } } /* Output I bought a Bag which is made from Plastic I bought some shoes which cost 333 I bought a Bag which is made from Crocodile skin I bought some shoes which cost 1000 I bought a Bag which is made from South african leather I bought some shoes which cost 2000 */