Sobes.tech
Junior — Middle

Обяснете основните разлики между моделите 'Фабричен метод' и 'Абстрактна фабрика'.

sobes.tech AI

Отговор от AI

Моделът Фабричен метод (Factory Method) определя интерфейс за създаване на обект, но позволява на подкласовете да решат кой клас да инстанцират. Тоест, създаването на конкретен обект се делегира на подкласовете. Обикновено се използва, когато има един продукт и няколко варианта за неговата реализация.

Абстрактна фабрика (Abstract Factory) предоставя интерфейс за създаване на семейства от свързани или зависими обекти без да указва техните конкретни класове. Това е патърн от по-високо ниво, който обединява няколко фабрични метода за създаване на различни, но свързани обекти.

Основни разлики:

  • Фокус: Фабричният метод създава един продукт, Абстрактната фабрика — семейство продукти.
  • Структура: Фабричният метод обикновено се реализира чрез наследяване и презаписване на метода за създаване, Абстрактната фабрика — чрез композиция и набор от интерфейси.
  • Използване: Фабричният метод е подходящ, когато трябва да се създават обекти от един тип с вариации, Абстрактната фабрика — когато трябва да се създават свързани обекти от различни типове, които трябва да работят заедно.

Пример на Dart (Flutter) за фабричния метод:

abstract class Button {
  void render();
}

class AndroidButton implements Button {
  @override
  void render() => print('Android бутон');
}

class IOSButton implements Button {
  @override
  void render() => print('iOS бутон');
}

abstract class Dialog {
  Button createButton();
  void render() {
    var button = createButton();
    button.render();
  }
}

class AndroidDialog extends Dialog {
  @override
  Button createButton() => AndroidButton();
}

class IOSDialog extends Dialog {
  @override
  Button createButton() => IOSButton();
}

Тук, Dialog е фабричният метод, който създава различни бутони в зависимост от платформата.

Абстрактната фабрика ще включва създаването на няколко свързани продукта, например бутони и чекбоксове, които трябва да са съвместими помежду си.