Middle
Abstrakt fabrikalar naqshining amalga oshirilishi qanday?
sobes.tech AI
AIdan javob
Abstract Factory naqshoni, bog'liq yoki bir-biriga bog'liq bo'lgan obyektlar oilasini ularning aniq sinflarini belgilamasdan yaratish uchun interfeys taqdim etadi.
Asosiy komponentlar:
- Abstract Factory: Abstrakt mahsulotlarni yaratish operatsiyalari uchun interfeysni e'lon qiladi.
- Concrete Factory: Aniq mahsulotlar oilasi uchun abstrakt mahsulotlarni yaratish operatsiyalarini amalga oshiradi.
- Abstract Product: Mahsulot turining interfeysini e'lon qiladi.
- Concrete Product: Aniq mahsulot uchun abstrakt mahsulot interfeysini amalga oshiradi.
- Client: Abstract Factory va Abstract Product interfeyslaridan foydalanadi, ammo Concrete Factory va Concrete Product haqida bilmaydi.
Amalga oshirish:
- Har bir mahsulot turi uchun yaratish metodlari bilan abstrakt fabrika aniqlanadi.
- Har bir mahsulot oilasi uchun, mos keladigan aniq mahsulotlarni yaratadigan konkret fabrika yaratiladi.
- Har bir mahsulot turi uchun, abstrakt mahsulot interfeysi aniqlanadi.
- Har bir konkret mahsulot uchun, mos keladigan interfeysni amalga oshiradigan sinf yaratiladi.
- Client, abstrakt fabrika ob'ektini oladi va uning metodlarini chaqiradi, faqat mahsulot interfeyslar bilan ishlaydi.
// Abstrakt fabrika
public interface IAbstractFactory
{
IAbstractProductA CreateProductA();
IAbstractProductB CreateProductB();
}
// Konkrekt fabrika 1
public class ConcreteFactory1 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
// Konkrekt fabrika 2
public class ConcreteFactory2 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
// Abstrakt mahsulot A
public interface IAbstractProductA
{
string UsefulFunctionA();
}
// Konkrekt mahsulot A1
public class ConcreteProductA1 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "A1 mahsulotining natijasi.";
}
}
// Konkrekt mahsulot A2
public class ConcreteProductA2 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "A2 mahsulotining natijasi.";
}
}
// Abstrakt mahsulot B
public interface IAbstractProductB
{
string UsefulFunctionB();
string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}
// Konkrekt mahsulot B1
public class ConcreteProductB1 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "B1 mahsulotining natijasi.";
}
// B1 mahsuloti faqat A mahsulotlari bilan ishlash mumkin
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"B1, ({result}) bilan hamkorlikda";
}
}
// Konkrekt mahsulot B2
public class ConcreteProductB2 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "B2 mahsulotining natijasi.";
}
// B2 mahsuloti faqat A mahsulotlari bilan ishlash mumkin
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"B2, ({result}) bilan hamkorlikda";
}
}
// Mijoz kodi
public class Client
{
public void Main()
{
// Mijoz kodi abstrakt fabrikadan ishlaydi
Console.WriteLine("Mijoz: Birinchi turdagi fabrik bilan mijoz kodini sinovdan o'tkazish:");
ClientMethod(new ConcreteFactory1());
Console.WriteLine();
Console.WriteLine("Mijoz: Ikkinchi turdagi fabrik bilan bir xil mijoz kodini sinovdan o'tkazish:");
ClientMethod(new ConcreteFactory2());
}
public void ClientMethod(IAbstractFactory factory)
{
var productA = factory.CreateProductA();
var productB = factory.CreateProductB();
Console.WriteLine(productB.UsefulFunctionB());
Console.WriteLine(productB.AnotherUsefulFunctionB(productA));
}
}