Sobes.tech
Junior

Podaj przykład użycia fabryki abstrakcyjnej

sobes.tech AI

Odpowiedź od AI

Abstrakcyjna fabryka to wzorzec kreacyjny, który zapewnia interfejs do tworzenia rodzin powiązanych obiektów bez określania ich konkretnych klas.

Przykład w C#:

// Interfejsy produktów
public interface IButton {
    void Render();
}

public interface ICheckbox {
    void Render();
}

// Konkrety produktów dla Windows
public class WindowsButton : IButton {
    public void Render() => Console.WriteLine("Renderowanie przycisku Windows");
}

public class WindowsCheckbox : ICheckbox {
    public void Render() => Console.WriteLine("Renderowanie pola wyboru Windows");
}

// Konkrety produktów dla MacOS
public class MacButton : IButton {
    public void Render() => Console.WriteLine("Renderowanie przycisku MacOS");
}

public class MacCheckbox : ICheckbox {
    public void Render() => Console.WriteLine("Renderowanie pola wyboru MacOS");
}

// Abstrakcyjna fabryka
public interface IGUIFactory {
    IButton CreateButton();
    ICheckbox CreateCheckbox();
}

// Konkretne fabryki
public class WindowsFactory : IGUIFactory {
    public IButton CreateButton() => new WindowsButton();
    public ICheckbox CreateCheckbox() => new WindowsCheckbox();
}

public class MacFactory : IGUIFactory {
    public IButton CreateButton() => new MacButton();
    public ICheckbox CreateCheckbox() => new MacCheckbox();
}

// Użycie
class Application {
    private IButton button;
    private ICheckbox checkbox;

    public Application(IGUIFactory factory) {
        button = factory.CreateButton();
        checkbox = factory.CreateCheckbox();
    }

    public void Render() {
        button.Render();
        checkbox.Render();
    }
}

// W kodzie klienta wybieramy potrzebną fabrykę
IGUIFactory factory = new WindowsFactory();
Application app = new Application(factory);
app.Render();

W tym przykładzie abstrakcyjna fabryka pozwala na tworzenie rodzin powiązanych obiektów (przycisków i pól wyboru) dla różnych platform, nie zależąc od konkretnych klas produktów.