الگوی Abstract Factory

الگوی Abstract Factory(کارخانه انتزاعی) در دسته الگوهای ایجادی قرار دارد.فراهم کردن یک واسط (Interface) برای ایجاد خانواده از اشیاء مرتبط و وابسته بدون مشخص کردن کلاس های بتنی خود. به عبارت دیگر تعریف ساختار یک کلاس کارخانه و تعدادی محصول به شکل انتزاعی به گونه‌ای که کارخانه‌های مختلف مطابق آن بتواند خانواده ای از محصول های متفاوت را تولید کرده و در اختیار کلاینت قرار بدهند. UML class diagram شركت كنندگان کلاس ها و اشیاء شرکت کننده در این الگو عبارتند از:کارخانه انتزاعی AbstractFactory ( کارخانه اقلیم- قاره در مثال دنیای واقعی ContinentFactory) : یک واسط برای عملیات هایی که محصولات انتزاعی را ایجاد می کنند، اعلام می کند.(واسطی که ساختار کلی کارخانه ها را تعریف می کند.)کارخانه سفت ConcreteFactory ( کارخانه آمریکا ، کارخانه آفریقاAfricaFactory, AmericaFactory) : عملیات را برای ایجاد اشیاء محصول سفت پیاده سازی میکند. به عبارت دیگر کارخانه هایی حقیقی و پیاده‌سازی شده که هر کدام محصول های یک خانواده را تولید می کنند. محصول انتزاعی AbstractProduct (گیاهخواری ، گوشتخواریHerbivore, Carnivore) : یک واسط برای یک نوع شیء محصول را اعلام می کند. به عبارت دیگر کلاس های انتزاعی که ساختار محصول های قابل تولید توسط کارخانه ها را تعریف می کنند. محصول Product ( گاومیش ، شیر ، میش ، گرگ Wildebeest, Lion, Bison, Wolf):یک شیء محصول را توسط ConcreteFactory مربوطه تعریف می کند.پیاده سازی واسط AbstractProductبه عبارت دیگر محصول های واقعی پیاده سازی شده و قابل تولید توسط ConcreteFactory کلاینت Client ( حیوانات جهان AnimalWorld) با استفاده از واسط های اعلام شده توسط کلاس های AbstractFactory و AbstractProduct استفاده می شود.( برنامه ای که از کارخانه و محصول های آن استفاده می کند. )ساختار کلی کدالگوی کارخانه انتزاعی ایجاد سلسله مراتب موازی اشیا را نشان می دهد. ایجاد شیء انتزاعی و هیچ نیازی به نام کلاس های کد-سخت( hard-coded ) در کد کلاینت وجود ندارد. using System; namespace DoFactory.GangOfFour.Abstract.Structural { /// <summary> /// MainApp startup class for Structural /// Abstract Factory Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> public static void Main () { // Abstract factory #1 AbstractFactory factory1 = new ConcreteFactory1 (); Client client1 = new Client (factory1); client1.Run (); // Abstract factory #2 AbstractFactory factory2 = new ConcreteFactory2 (); Client client2 = new Client (factory2); client2.Run (); // Wait for user input Console.ReadKey (); } } /// <summary> /// The 'AbstractFactory' abstract class /// </summary> abstract class AbstractFactory { public abstract AbstractProductA CreateProductA (); public abstract AbstractProductB CreateProductB (); } /// <summary> /// The 'ConcreteFactory1' class /// </summary> class ConcreteFactory1 : AbstractFactory { public override AbstractProductA CreateProductA () { return new ProductA1 (); } public override AbstractProductB CreateProductB () { return new ProductB1 (); } } /// <summary> /// The 'ConcreteFactory2' class /// </summary> class ConcreteFactory2 : AbstractFactory { public override AbstractProductA CreateProductA () { return new ProductA2 (); } public override AbstractProductB CreateProductB () { return new ProductB2 (); } } /// <summary> /// The 'AbstractProductA' abstract class /// </summary> abstract class AbstractProductA { } /// <summary> /// The 'AbstractProductB' abstract class /// </summary> abstract class AbstractProductB { public abstract void Interact (AbstractProductA a); } /// <summary> /// The 'ProductA1' class /// </summary> class ProductA1 : AbstractProductA { } /// <summary> /// The 'ProductB1' class /// </summary> class ProductB1 : AbstractProductB { public override void Interact (AbstractProductA a) { Console.WriteLine (this.GetType ().Name + " interacts with " + a.GetType ().Name); } } /// <summary> /// The 'ProductA2' class /// </summary> class ProductA2 : AbstractProductA { } /// <summary> /// The 'ProductB2' class /// </summary> class ProductB2 : AbstractProductB { public override void Interact (AbstractProductA a) { Console.WriteLine (this.GetType ().Name + " interacts with " + a.GetType ().Name); } } /// <summary> /// The 'Client' class. Interaction environment for the products. /// </summary> class Client { private AbstractProductA _abstractProductA; private AbstractProductB _abstractProductB; // Constructor public Client (AbstractFactory factory) { _abstractProductB = factory.CreateProductB (); _abstractProductA = factory.CreateProductA (); } public void Run () { _abstractProductB.Interact (_abstractProductA); } } } OutputProductB1 interacts with ProductA1ProductB2 interacts with ProductA2یاabstract class AbstractFactory { public abstract void Start(); public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB CreateProductB(); } abstract class AbstractProductA { public abstract void Display(); } abstract class AbstractProductB { public abstract void Show(); } class ConcreteFactory1: AbstractFactory { public override void Start() { Console.WriteLine("ConcreteFactory1"); } public override AbstractProductA CreateProductA() { return new ProductA1(); } public override AbstractProductB CreateProductB() { return new ProductB1(); } } class ConcreteFactory2: AbstractFactory { public override void Start() { Console.WriteLine("ConcreteFactory2"); } public override AbstractProductA CreateProductA() { return new ProductA2(); } public override AbstractProductB CreateProductB() { return new ProductB2(); } } class ProductA1: AbstractProductA { public override void Display() { Console.WriteLine("ProductA1"); } } class ProductA2: AbstractProductA { public override void Display() { Console.WriteLine("ProductA2"); } } class ProductB1: AbstractProductB { public override void Show() { Console.WriteLine("ProductB1"); } } class ProductB2: AbstractProductB { public override void Show() { Console.WriteLine("ProductB2"); } } class Client { private AbstractFactory factory; public void SetFactory(AbstractFactory factory) { this.factory = factory; } public void Run() { factory.Start(); var p1 = factory.CreateProductA(); var p2 = factory.CreateProductB(); p1.Display(); p2.Show(); } } class Test { public static void Main() { var factory1 = new ConcreteFactory1(); var client = new Client(); client.SetFactory(factory1); client.Run(); Console.WriteLine(); var factory2 = new ConcreteFactory2(); client.SetFactory(factory2); client.Run(); Console.ReadKey(); } } /* OUTPUT:ConcreteFactory1ProductA1ProductB1ConcreteFactory2ProductA2ProductB2*/مثال دنیای واقعی نشان دهنده ایجاد دنیای حیوانات مختلف برای یک بازی کامپیوتری با استفاده از کارخانه های مختلف است. گرچه حیوانات ایجاد شده توسط کارخانه های قاره ای متفاوت هستند، تعاملات بین حیوانات باقی می ماند. using System; namespace DoFactory.GangOfFour.Abstract.RealWorld { /// <summary> /// MainApp startup class for Real-World /// Abstract Factory Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> public static void Main () { // Create and run the African animal world ContinentFactory africa = new AfricaFactory (); AnimalWorld world = new AnimalWorld (africa); world.RunFoodChain (); // Create and run the American animal world ContinentFactory america = new AmericaFactory (); world = new AnimalWorld (america); world.RunFoodChain (); // Wait for user input Console.ReadKey (); } } /// <summary> /// The 'AbstractFactory' abstract class /// </summary> abstract class ContinentFactory { public abstract Herbivore CreateHerbivore (); public abstract Carnivore CreateCarnivore (); } /// <summary> /// The 'ConcreteFactory1' class /// </summary> class AfricaFactory : ContinentFactory { public override Herbivore CreateHerbivore () { return new Wildebeest (); } public override Carnivore CreateCarnivore () { return new Lion (); } } /// <summary> /// The 'ConcreteFactory2' class /// </summary> class AmericaFactory : ContinentFactory { public override Herbivore CreateHerbivore () { return new Bison (); } public override Carnivore CreateCarnivore () { return new Wolf (); } } /// <summary> /// The 'AbstractProductA' abstract class /// </summary> abstract class Herbivore { } /// <summary> /// The 'AbstractProductB' abstract class /// </summary> abstract class Carnivore { public abstract void Eat (Herbivore h); } /// <summary> /// The 'ProductA1' class /// </summary> class Wildebeest : Herbivore { } /// <summary> /// The 'ProductB1' class /// </summary> class Lion : Carnivore { public override void Eat (Herbivore h) { // Eat Wildebeest Console.WriteLine (this.GetType ().Name + " eats " + h.GetType ().Name); } } /// <summary> /// The 'ProductA2' class /// </summary> class Bison : Herbivore { } /// <summary> /// The 'ProductB2' class /// </summary> class Wolf : Carnivore { public override void Eat (Herbivore h) { // Eat Bison Console.WriteLine (this.GetType ().Name + " eats " + h.GetType ().Name); } } /// <summary> /// The 'Client' class /// </summary> class AnimalWorld { private Herbivore _herbivore; private Carnivore _carnivore; // Constructor public AnimalWorld (ContinentFactory factory) { _carnivore = factory.CreateCarnivore (); _herbivore = factory.CreateHerbivore (); } public void RunFoodChain () { _carnivore.Eat (_herbivore); } } } OutputLion eats WildebeestWolf eats Bisonمنبع