Sobes.tech
Middle+

Uveďte příklady použití vzoru abstraktní továrny.

sobes.tech AI

Odpověď od AI

Vzor abstraktní továrny je užitečný, když je třeba vytvořit rodinu souvisejících nebo závislých objektů bez specifikace jejich konkrétních tříd. Příklady z praxe:

  1. Vytváření prvků uživatelského rozhraní (GUI) pro různé operační systémy:

    • Abstraktní továrna (IGUIFactory) může mít metody pro vytváření tlačítek (CreateButton), textových polí (CreateTextBox) a dalších prvků.
    • Konkrétní továrny (WindowsFactory, MacOSFactory) implementují IGUIFactory a vytvářejí platformově specifické prvky.
    • Klientský kód pracuje pouze s rozhraními (IButton, ITextBox), aniž by znal konkrétní implementaci.
    // Abstraktní produkty
    public interface IButton
    {
        void Render();
    }
    
    public interface ITextBox
    {
        void ShowText();
    }
    
    // Konkrétní produkty pro Windows
    public class WindowsButton : IButton
    {
        public void Render() { /* Logika vykreslení Windows tlačítka */ }
    }
    
    public class WindowsTextBox : ITextBox
    {
        public void ShowText() { /* Logika zobrazení textu ve Windows textovém poli */ }
    }
    
    // Konkrétní produkty pro MacOS
    public class MacOSButton : IButton
    {
        public void Render() { /* Logika vykreslení MacOS tlačítka */ }
    }
    
    public class MacOSTextBox : ITextBox
    {
        public void ShowText() { /* Logika zobrazení textu v MacOS textovém poli */ }
    }
    
    // Abstraktní továrna
    public interface IGUIFactory
    {
        IButton CreateButton();
        ITextBox CreateTextBox();
    }
    
    // Konkrétní továrna pro Windows
    public class WindowsFactory : IGUIFactory
    {
        public IButton CreateButton() { return new WindowsButton(); }
        public ITextBox CreateTextBox() { return new WindowsTextBox(); }
    }
    
    // Konkrétní továrna pro MacOS
    public class MacOSFactory : IGUIFactory
    {
        public IButton CreateButton() { return new MacOSButton(); }
        public ITextBox CreateTextBox() { return new MacOSTextBox(); }
    }
    
    // Klientský kód
    public class Application
    {
        private readonly IGUIFactory _factory;
        private IButton _button;
        private ITextBox _textBox;
    
        public Application(IGUIFactory factory)
        {
            _factory = factory;
            _button = _factory.CreateButton();
            _textBox = _factory.CreateTextBox();
        }
    
        public void Paint()
        {
            _button.Render();
            _textBox.ShowText();
        }
    }
    
    // Použití
    // var factory = new WindowsFactory(); // Nebo new MacOSFactory();
    // var app = new Application(factory);
    // app.Paint();
    
  2. Vytváření objektů pro přístup k datům (DAO) pro různé typy databází:

    • Abstraktní továrna (IDatabaseFactory) může mít metody pro vytváření DAO pro uživatele (CreateUserDAO), produkty (CreateProductDAO) atd.
    • Konkrétní továrny (SqlDatabaseFactory, OracleDatabaseFactory) implementují IDatabaseFactory a vytvářejí DAO specifické pro danou databázi.
    • To umožňuje snadno změnit typ databáze bez změny obchodní logiky.
    // Abstraktní DAO
    public interface IUserDAO
    {
        void InsertUser(string username);
    }
    
    public interface IProductDAO
    {
        void AddProduct(string productName);
    }
    
    // Konkrétní DAO pro SQL
    public class SqlUserDAO : IUserDAO
    {
        public void InsertUser(string username) { /* SQL INSERT logika */ }
    }
    
    public class SqlProductDAO : IProductDAO
    {
        public void AddProduct(string productName) { /* SQL INSERT logika */ }
    }
    
    // Konkrétní DAO pro Oracle
    public class OracleUserDAO : IUserDAO
    {
        public void InsertUser(string username) { /* Oracle INSERT logika */ }
    }
    
    public class OracleProductDAO : IProductDAO
    {
        public void AddProduct(string productName) { /* Oracle INSERT logika */ }
    }
    
    // Abstraktní továrna
    public interface IDatabaseFactory
    {
        IUserDAO CreateUserDAO();
        IProductDAO CreateProductDAO();
    }
    
    // Konkrétní továrna pro SQL
    public class SqlDatabaseFactory : IDatabaseFactory
    {
        public IUserDAO CreateUserDAO() { return new SqlUserDAO(); }
        public IProductDAO CreateProductDAO() { return new SqlProductDAO(); }
    }
    
    // Konkrétní továrna pro Oracle
    public class OracleDatabaseFactory : IDatabaseFactory
    {
        public IUserDAO CreateUserDAO() { return new OracleUserDAO(); }
        public IProductDAO CreateProductDAO() { return new OracleProductDAO(); }
    }
    
    // Příklad použití v obchodní logice
    public class BusinessLogic
    {
        private readonly IDatabaseFactory _factory;
    
        public BusinessLogic(IDatabaseFactory factory)
        {
            _factory = factory;
        }
    
        public void RegisterUser(string username)
        {
            var userDAO = _factory.CreateUserDAO();
            userDAO.InsertUser(username);
        }
    }
    
  3. Vytváření objektů pro práci s různými formáty souborů (např. XML, JSON):

    • Abstraktní továrna může vytvářet parsery (CreateParser) a serializéry (CreateSerializer) pro různé formáty.
    • Konkrétní továrny (XmlFactory, JsonFactory) poskytnou implementace specifické pro XML a JSON.

Tyto příklady ukazují, jak abstraktní továrna umožňuje vytvářet rodiny vzájemně propojených objektů, odděluje klientský kód od jejich konkrétních implementací a usnadňuje přidávání nových rodin.