Тема: В чому відмінність паттернів проектуванн "factory" и "factory metod"?
В чому відмінність паттернів проектування "factory" и "factory metod"? Вибачаюсь за тупе питання)
перечитав инфу на форумі не знайшов...
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Java → В чому відмінність паттернів проектуванн "factory" и "factory metod"?
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
В чому відмінність паттернів проектування "factory" и "factory metod"? Вибачаюсь за тупе питання)
перечитав инфу на форумі не знайшов...
Фабричний метод - це метод. Один метод. Можна вважати його зовнішнім конструктором: і конструктор, і фабричний метод створює об'єкт.
Фабрика - це об'єкт, що має кілька методів. Ці методи, фактично, є фабричними (хоча ніхто не зобороняє фабриці мати й інші методи), але ми маємо додатковий рівень абстракції. Ми можемо передавати фабрику в інші функції, і ті будуть конструювати потрібні їм об'єкти за потребою запитами до цієї фабрики.
І ставте спойлери (права кнопка S над полем введення) навколо посилань на російське.
Фабричний метод - це метод. Один метод. Можна вважати його зовнішнім конструктором: і конструктор, і фабричний метод створює об'єкт.
Фабрика - це об'єкт, що має кілька методів. Ці методи, фактично, є фабричними (хоча ніхто не зобороняє фабриці мати й інші методи), але ми маємо додатковий рівень абстракції. Ми можемо передавати фабрику в інші функції, і ті будуть конструювати потрібні їм об'єкти за потребою запитами до цієї фабрики.І ставте спойлери (права кнопка S над полем введення) навколо посилань на російське.
а самі функції/методи можна передавати в інші функції?
Дивіться. Мова йде про реально складні ситуації. Якщо треба просто створити об'єкт певного класу - є звичайний конструктор, даємо йому параметри, маємо об'єкт. Все просто.
Якщо нам треба, залежно від параметрів, обирати підтип об'єкту (щоб функція повертала одного з нащадків) - це фабричний метод. Можна його робити і там, де точно буде відомий тип повертатися, це просто чистіший варіант.
А тепер розглянемо ситуацію... ну, скажімо, коли нам треба реалізувати настільну гру. Можливо, шахи, може, мафію, а можливо, MTG. В цілому ж всі такі ігри приблизно однаково граються, так? Є певний спільний простір (стіл), гравці, можливо, якісь частини з персональним доступом, ігрові об'єкти (фігури, карти, фішки), дошка (а може, це і є стіл?). І от ми хочемо, щоб виклик на кшталт
GameObject game = create_game(type, parameters);
створив нам початкову ситуацію у грі.
Але create_game має бути дуже гнучким. І гнучкість доведеться проявляти дуже глибоко і заплутано. Деякі методи будуть викликати цілу купу додаткових конструкторів (наприклад, конструктор шахової дошки буде створювати фігури, причому різні, залежно від того, це шахи чи шашки). В результаті має сенс створити фабрику
BoardGameFactory
з методами на кшталт
create_players
create_board
create_figures
setup_game
і т.д., а потім створити у неї нащадків з різними реалізаціями цих методів. А create_game буде залежно від параметрів смикати різні методи фабрики в різних послідовностях (наприклад, для ігор без дошки не буде викликатися create_board). Коротше - це не від хорошого життя такі абстракції придумали
Можливо, приблизно так:
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 вже викликає потрібні методи фабрики
і т.д.
}
а самі функції/методи можна передавати в інші функції?
Наскільки я розумію, не в Java. Там є лямбди і патерн "команда".
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися