Middle
Mi az absztrakt gyártási minta megvalósítása?
sobes.tech MI
Válasz az MI-től
Az Abstract Factory minta egy interfészt biztosít az egymással kapcsolódó vagy függő objektumcsaládok létrehozásához anélkül, hogy meghatároznánk azok konkrét osztályait.
Fő komponensek:
- Abstract Factory: Kinyilvánít egy interfészt az absztrakt termékek létrehozási műveleteire.
- Concrete Factory: Megvalósítja az absztrakt termékek létrehozási műveleteit egy adott termékcsaládhoz.
- Abstract Product: Kinyilvánít egy interfészt a termék típusára.
- Concrete Product: Megvalósítja az Abstract Product interfészt egy adott termékre.
- Client: Használja az Abstract Factory és Abstract Product interfészeket, de nem ismeri a Concrete Factory és Concrete Product részleteit.
Implementáció:
- Egy absztrakt gyár van definiálva, amely minden terméktípushoz létrehozási módszereket tartalmaz.
- Minden termékcsaládhoz egy konkrét gyár készül, amely megvalósítja az absztrakt gyár módszereit, és létrehozza a megfelelő konkrét termékeket.
- Minden terméktípushoz egy absztrakt interfész van.
- Minden konkrét termékhez egy osztály tartozik, amely megvalósítja a megfelelő interfészt.
- A klienskód egy absztrakt gyár objektumot kap, és meghívja annak módszereit a termékek létrehozásához, kizárólag a termékinterfészekkel dolgozva.
// Absztrakt gyár
public interface IAbstractFactory
{
IAbstractProductA CreateProductA();
IAbstractProductB CreateProductB();
}
// Konkrét gyár 1
public class ConcreteFactory1 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
// Konkrét gyár 2
public class ConcreteFactory2 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
// Absztrakt termék A
public interface IAbstractProductA
{
string UsefulFunctionA();
}
// Konkrét termék A1
public class ConcreteProductA1 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "A1 termék eredménye.";
}
}
// Konkrét termék A2
public class ConcreteProductA2 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "A2 termék eredménye.";
}
}
// Absztrakt termék B
public interface IAbstractProductB
{
string UsefulFunctionB();
string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}
// Konkrét termék B1
public class ConcreteProductB1 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "B1 termék eredménye.";
}
// B1 termék csak A ugyanazon variánsával működik
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"B1 eredménye együttműködve a ({result})-vel";
}
}
// Konkrét termék B2
public class ConcreteProductB2 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "B2 termék eredménye.";
}
// B2 termék csak A ugyanazon variánsával működik
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"B2 eredménye együttműködve a ({result})-vel";
}
}
// Klienskód
public class Client
{
public void Main()
{
// Klienskód az absztrakt gyárral dolgozik
Console.WriteLine("Ügyfél: Teszteli az ügyfélkódot az első gyártípussal:");
ClientMethod(new ConcreteFactory1());
Console.WriteLine();
Console.WriteLine("Ügyfél: Teszteli ugyanazt az ügyfélkódot a második gyártípussal:");
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));
}
}