Middle
Ποια είναι η υλοποίηση του μοτίβου αφηρημένης εργοστασιακής?
sobes.tech AI
Απάντηση από AI
Το μοτίβο Abstract Factory παρέχει μια διεπαφή για τη δημιουργία οικογενειών αλληλεξαρτώμενων ή εξαρτώμενων αντικειμένων, χωρίς να καθορίζει τις συγκεκριμένες κλάσεις τους.
Βασικά στοιχεία:
- Abstract Factory: Δηλώνει μια διεπαφή για τις λειτουργίες δημιουργίας αφηρημένων προϊόντων.
- Concrete Factory: Υλοποιεί τις λειτουργίες δημιουργίας αφηρημένων προϊόντων για μια συγκεκριμένη οικογένεια προϊόντων.
- Abstract Product: Δηλώνει μια διεπαφή για τον τύπο προϊόντος.
- Concrete Product: Υλοποιεί τη διεπαφή του Abstract Product για ένα συγκεκριμένο προϊόν.
- Client: Χρησιμοποιεί τις διεπαφές του Abstract Factory και του Abstract Product, αλλά δεν γνωρίζει για τις Concrete Factory και Concrete Product.
Εφαρμογή:
- Ορίζεται μια αφηρημένη εργοστάσια με μεθόδους για τη δημιουργία κάθε τύπου προϊόντος.
- Για κάθε οικογένεια προϊόντων δημιουργείται μια συγκεκριμένη εργοστάσια που υλοποιεί τις μεθόδους της αφηρημένης εργοστάσια και δημιουργεί τα αντίστοιχα συγκεκριμένα προϊόντα.
- Για κάθε τύπο προϊόντος ορίζεται μια αφηρημένη διεπαφή.
- Για κάθε συγκεκριμένο προϊόν δημιουργείται μια κλάση που υλοποιεί τη σχετική διεπαφή.
- Ο κώδικας πελάτη λαμβάνει ένα αντικείμενο αφηρημένης εργοστάσια και καλεί τις μεθόδους της για τη δημιουργία προϊόντων, δουλεύοντας μόνο με τις διεπαφές των προϊόντων.
// Αφηρημένη εργοστάσια
public interface IAbstractFactory
{
IAbstractProductA CreateProductA();
IAbstractProductB CreateProductB();
}
// Συγκεκριμένη εργοστάσια 1
public class ConcreteFactory1 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
// Συγκεκριμένη εργοστάσια 2
public class ConcreteFactory2 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
// Αφηρημένο προϊόν A
public interface IAbstractProductA
{
string UsefulFunctionA();
}
// Συγκεκριμένο προϊόν A1
public class ConcreteProductA1 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "Το αποτέλεσμα του προϊόντος A1.";
}
}
// Συγκεκριμένο προϊόν A2
public class ConcreteProductA2 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "Το αποτέλεσμα του προϊόντος A2.";
}
}
// Αφηρημένο προϊόν B
public interface IAbstractProductB
{
string UsefulFunctionB();
string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}
// Συγκεκριμένο προϊόν B1
public class ConcreteProductB1 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "Το αποτέλεσμα του προϊόντος B1.";
}
// Το προϊόν B1 μπορεί να συνεργάζεται μόνο με προϊόντα A της ίδιας παραλλαγής
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"Το αποτέλεσμα του B1 συνεργαζόμενου με το ({result})";
}
}
// Συγκεκριμένο προϊόν B2
public class ConcreteProductB2 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "Το αποτέλεσμα του προϊόντος B2.";
}
// Το προϊόν B2 μπορεί να συνεργάζεται μόνο με προϊόντα A της ίδιας παραλλαγής
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"Το αποτέλεσμα του B2 συνεργαζόμενου με το ({result})";
}
}
// Κώδικας πελάτη
public class Client
{
public void Main()
{
// Ο κώδικας πελάτη δουλεύει με την αφηρημένη εργοστάσια
Console.WriteLine("Πελάτης: Δοκιμή κώδικα πελάτη με τον πρώτο τύπο εργοστάσια:");
ClientMethod(new ConcreteFactory1());
Console.WriteLine();
Console.WriteLine("Πελάτης: Δοκιμή του ίδιου κώδικα πελάτη με τον δεύτερο τύπο εργοστάσια:");
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));
}
}