Sobes.tech
Middle+

Adjon példákat az absztrakt gyár mintájának használatára.

sobes.tech MI

Válasz az MI-től

Az absztrakt gyár minta akkor hasznos, amikor egy kapcsolódó vagy függő objektumcsaládot kell létrehozni anélkül, hogy azok konkrét osztályait meg kellene határozni. A való élet példái:

  1. Felhasználói felület (GUI) elemek létrehozása különböző operációs rendszerekhez:

    • Az absztrakt gyár (IGUIFactory) tartalmazhat metódusokat gombok (CreateButton), szövegmezők (CreateTextBox) és más elemek létrehozására.
    • Konkrét gyárak (WindowsFactory, MacOSFactory) implementálják az IGUIFactory-t, és platform-specifikus elemeket hoznak létre.
    • A klienskód csak az interfészekkel (IButton, ITextBox) dolgozik, nem tudva a konkrét implementációkról.
    // Absztrakt termékek
    public interface IButton
    {
        void Render();
    }
    
    public interface ITextBox
    {
        void ShowText();
    }
    
    // Konkrét termékek Windows-hoz
    public class WindowsButton : IButton
    {
        public void Render() { /* Windows gomb renderelési logika */ }
    }
    
    public class WindowsTextBox : ITextBox
    {
        public void ShowText() { /* Windows szövegmező megjelenítési logika */ }
    }
    
    // Konkrét termékek MacOS-hez
    public class MacOSButton : IButton
    {
        public void Render() { /* MacOS gomb renderelési logika */ }
    }
    
    public class MacOSTextBox : ITextBox
    {
        public void ShowText() { /* MacOS szövegmező megjelenítési logika */ }
    }
    
    // Absztrakt gyár
    public interface IGUIFactory
    {
        IButton CreateButton();
        ITextBox CreateTextBox();
    }
    
    // Konkrét gyár Windows-hoz
    public class WindowsFactory : IGUIFactory
    {
        public IButton CreateButton() { return new WindowsButton(); }
        public ITextBox CreateTextBox() { return new WindowsTextBox(); }
    }
    
    // Konkrét gyár MacOS-hez
    public class MacOSFactory : IGUIFactory
    {
        public IButton CreateButton() { return new MacOSButton(); }
        public ITextBox CreateTextBox() { return new MacOSTextBox(); }
    }
    
    // Klienskó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();
        }
    }
    
    // Használat
    // var factory = new WindowsFactory(); // Vagy new MacOSFactory();
    // var app = new Application(factory);
    // app.Paint();
    
  2. Adat-hozzáférési objektumok (DAO) létrehozása különböző adatbázistípusokhoz:

    • Az absztrakt gyár (IDatabaseFactory) tartalmazhat metódusokat DAO-k létrehozására felhasználók (CreateUserDAO), termékek (CreateProductDAO) stb. számára.
    • Konkrét gyárak (SqlDatabaseFactory, OracleDatabaseFactory) implementálják az IDatabaseFactory-t, és platform-specifikus DAO-kat hoznak létre.
    • Ez megkönnyíti az adatbázis típusának cseréjét anélkül, hogy a üzleti logikát módosítani kellene.
    // Absztrakt DAO-k
    public interface IUserDAO
    {
        void InsertUser(string username);
    }
    
    public interface IProductDAO
    {
        void AddProduct(string productName);
    }
    
    // Konkrét DAO-k SQL-hez
    public class SqlUserDAO : IUserDAO
    {
        public void InsertUser(string username) { /* SQL beszúrási logika */ }
    }
    
    public class SqlProductDAO : IProductDAO
    {
        public void AddProduct(string productName) { /* SQL beszúrási logika */ }
    }
    
    // Konkrét DAO-k Oracle-hez
    public class OracleUserDAO : IUserDAO
    {
        public void InsertUser(string username) { /* Oracle beszúrási logika */ }
    }
    
    public class OracleProductDAO : IProductDAO
    {
        public void AddProduct(string productName) { /* Oracle beszúrási logika */ }
    }
    
    // Absztrakt gyár
    public interface IDatabaseFactory
    {
        IUserDAO CreateUserDAO();
        IProductDAO CreateProductDAO();
    }
    
    // Konkrét gyár SQL-hez
    public class SqlDatabaseFactory : IDatabaseFactory
    {
        public IUserDAO CreateUserDAO() { return new SqlUserDAO(); }
        public IProductDAO CreateProductDAO() { return new SqlProductDAO(); }
    }
    
    // Konkrét gyár Oracle-hez
    public class OracleDatabaseFactory : IDatabaseFactory
    {
        public IUserDAO CreateUserDAO() { return new OracleUserDAO(); }
        public IProductDAO CreateProductDAO() { return new OracleProductDAO(); }
    }
    
    // Példa a üzleti logikában
    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. Objektumok létrehozása különböző fájlformátumokhoz (pl. XML, JSON):

    • Az absztrakt gyár parser-eket (CreateParser) és serializer-eket (CreateSerializer) hoz létre különböző formátumokhoz.
    • Konkrét gyárak (XmlFactory, JsonFactory) biztosítják a platform-specifikus implementációkat, XML és JSON esetében.

Ezek a példák bemutatják, hogyan lehet az absztrakt gyár segítségével családokat létrehozni, elválasztva a klienskódot a konkrét implementációktól, és megkönnyítve az új családok hozzáadását.