1 Востаннє редагувалося Rydenko Genya (10.02.2020 15:50:35)

Тема: В чому відмінність паттернів проектуванн "factory" и "factory metod"?

В чому відмінність паттернів проектування "factory" и "factory metod"?  Вибачаюсь за тупе питання)

перечитав инфу на форумі не знайшов...

2 Востаннє редагувалося koala (10.02.2020 15:30:36)

Re: В чому відмінність паттернів проектуванн "factory" и "factory metod"?

Фабричний метод - це метод. Один метод. Можна вважати його зовнішнім конструктором: і конструктор, і фабричний метод створює об'єкт.
Фабрика - це об'єкт, що має кілька методів. Ці методи, фактично, є фабричними (хоча ніхто не зобороняє фабриці мати й інші методи), але ми маємо додатковий рівень абстракції. Ми можемо передавати фабрику в інші функції, і ті будуть конструювати потрібні їм об'єкти за потребою запитами до цієї фабрики.

І ставте спойлери (права кнопка S над полем введення) навколо посилань на російське.

Подякували: Rydenko Genya, sensei, Q-bart3

3

Re: В чому відмінність паттернів проектуванн "factory" и "factory metod"?

koala написав:

Фабричний метод - це метод. Один метод. Можна вважати його зовнішнім конструктором: і конструктор, і фабричний метод створює об'єкт.
Фабрика - це об'єкт, що має кілька методів. Ці методи, фактично, є фабричними (хоча ніхто не зобороняє фабриці мати й інші методи), але ми маємо додатковий рівень абстракції. Ми можемо передавати фабрику в інші функції, і ті будуть конструювати потрібні їм об'єкти за потребою запитами до цієї фабрики.

І ставте спойлери (права кнопка S над полем введення) навколо посилань на російське.

а самі функції/методи можна передавати в інші функції?

4 Востаннє редагувалося koala (11.02.2020 12:47:47)

Re: В чому відмінність паттернів проектуванн "factory" и "factory metod"?

Дивіться. Мова йде про реально складні ситуації. Якщо треба просто створити об'єкт певного класу - є звичайний конструктор, даємо йому параметри, маємо об'єкт. Все просто.
Якщо нам треба, залежно від параметрів, обирати підтип об'єкту (щоб функція повертала одного з нащадків) - це фабричний метод. Можна його робити і там, де точно буде відомий тип повертатися, це просто чистіший варіант.
А тепер розглянемо ситуацію... ну, скажімо, коли нам треба реалізувати настільну гру. Можливо, шахи, може, мафію, а можливо, MTG. В цілому ж всі такі ігри приблизно однаково граються, так? Є певний спільний простір (стіл), гравці, можливо, якісь частини з персональним доступом, ігрові об'єкти (фігури, карти, фішки), дошка (а може, це і є стіл?). І от ми хочемо, щоб виклик на кшталт

GameObject game = create_game(type, parameters);

створив нам початкову ситуацію у грі.
Але create_game має бути дуже гнучким. І гнучкість доведеться проявляти дуже глибоко і заплутано. Деякі методи будуть викликати цілу купу додаткових конструкторів (наприклад, конструктор шахової дошки буде створювати фігури, причому різні, залежно від того, це шахи чи шашки). В результаті має сенс створити фабрику
BoardGameFactory
з методами на кшталт
create_players
create_board
create_figures
setup_game
і т.д., а потім створити у неї нащадків з різними реалізаціями цих методів. А create_game буде залежно від параметрів смикати різні методи фабрики в різних послідовностях (наприклад, для ігор без дошки не буде викликатися create_board). Коротше - це не від хорошого життя такі абстракції придумали :)

Подякували: pluszz, FakiNyan2

5 Востаннє редагувалося koala (11.02.2020 11:01:11)

Re: В чому відмінність паттернів проектуванн "factory" и "factory metod"?

Можливо, приблизно так:

BoardGameFactory factory = create_fabric(type); //фабричний метод створює фабрику залежно від параметрів
GameObject game = create_game(factory, parameters);
GameObject create_game(BoardGameFactory factory, ??? parameters)
{
    GameObject game = factory.create_game_object();
    if(factory.has_board())
        game.add_board(factory.create_board(parameters.board_type));
    game.add_players(factory.create_players(parameters.player_count));
    for(player in game.players)
        player.create_figures(factory); //а Player.create_figures вже викликає потрібні методи фабрики
    і т.д.
}

6

Re: В чому відмінність паттернів проектуванн "factory" и "factory metod"?

FakiNyan написав:

а самі функції/методи можна передавати в інші функції?

Наскільки я розумію, не в Java. Там є лямбди і патерн "команда".