Sobes.tech
Middle

Ποια είναι η υλοποίηση του μοτίβου αφηρημένης εργοστασιακής?

sobes.tech AI

Απάντηση από AI

Το μοτίβο Abstract Factory παρέχει μια διεπαφή για τη δημιουργία οικογενειών αλληλεξαρτώμενων ή εξαρτώμενων αντικειμένων, χωρίς να καθορίζει τις συγκεκριμένες κλάσεις τους.

Βασικά στοιχεία:

  1. Abstract Factory: Δηλώνει μια διεπαφή για τις λειτουργίες δημιουργίας αφηρημένων προϊόντων.
  2. Concrete Factory: Υλοποιεί τις λειτουργίες δημιουργίας αφηρημένων προϊόντων για μια συγκεκριμένη οικογένεια προϊόντων.
  3. Abstract Product: Δηλώνει μια διεπαφή για τον τύπο προϊόντος.
  4. Concrete Product: Υλοποιεί τη διεπαφή του Abstract Product για ένα συγκεκριμένο προϊόν.
  5. 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));
    }
}