Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
3 / 3 / 0
Регистрация: 28.05.2012
Сообщений: 23

Абстрактная фабрика

28.05.2012, 20:53. Показов 5331. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня проблема следующего рода. Есть абстрактный класс Player. Есть два класса наследника Human и Computer, предназначенные для абсолютно дурацкой игры "3 пальца" (но это не важно)

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Player{
private:
    int fing;  // Количество пальцев
    int score; // Очки
public:
    Player(){
        fing = 0;       // Конструктор
        score = 0;
    }
    ~Player(){
        fing = 0;       // Деструктор
        score = 0;
    }
 
    void win(int y) {score += y;}   //Прибавить счет
    int  score()    {return score;} //Выдать счет
    int  get_fing() {return fing;}  //Выдать палец
 
    virtual void set_fing() = 0;    //Присвоить палец
    
};
 
 
class Computer: public Player{
public:
    virtual void set_fing(){    //Присвоить палец
        fing = rand()%3+1;
        printf("Computer has shown %d fingers\n", fing);
        sleep(1);
    }
    
};
 
class Human: public Player{
public:
    virtual void set_fing(){    //Присвоить палец
        printf("Enter a number from 1 to 3: ");
 
        int t = 1;
        while(t){
            scanf("%d\n", &fing);
            if (fing<1 || fing>3){
                printf("Incorrect number, please try again\n");
            }
            else t = 0;
        }
        printf("Player has shown   %d fingers\n", fing);
        sleep(1);
    }
};
В самом начале этой игры консоль должна опоросить пользователя, в какой режим игры он выбирает: Human vs Computer, Computer vs Computer или Human vs Human. Если режим выбран Human vs Computer, то также требуется спросить пользователя, хочет ли он быть четным или нечетным (всмысле ходить первым или вторым). В зависимости от того, что выберет в итоге пользователь, мы создадим два объекта - A и B. A будет ходить первым и будет считаться нечетным, B - наоборот, второй и четный. Так вот, A и B могут быть как Human, так и Computer (это зависит от режима игры). Лично я создавал эти объекты простым case'ом:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
switch(gmode){
 
case 1:{
    int ev;
    printf("\nWould you like to be odd or even? (O/E) ");
    int t = 1;
    while(t){
        scanf("%d", &ev);
        if (ev!="O" || ev!="E"){
            printf("Incorrect character, please try again\n");
        }
        else t = 0;
    }
 
    if(ev=="O"){
        Player *A = new Human;
        Player *B = new Computer;
    }
    else{
        Player *A = new Computer;
        Player *B = new Human;
    }
}
break;
 
case 2:{
    Player *A = new Human;
    Player *B = new Human;
}
break;
 
case 3:{
    Player *A = new Computer;
    Player *B = new Computer;
}
break;
}
Однако же препод забраковал такой подход и сказал, что было бы куда лучше если бы я использовал абстрактную фабрику для создания объектов, а case это плохо и нечитабельно (хотя по мне, так все предельно понятно).

Я понимаю, что из себя представляет фабричный метод и что такое абстрактная фабрика, но концы с концами свести не могу - запутался. Помогите, пожалуйста
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.05.2012, 20:53
Ответы с готовыми решениями:

Абстрактная фабрика
Здравствуйте, есть задание по лабе: &quot;Реализуйте Абстрактную фабрику для производства армии клонов Галактической империи. В армии существует...

Курсовая работа Паттерн «Абстрактная фабрика/Abstract Factory»
Задание на курсовой проект: Паттерн «Абстрактная фабрика/Abstract Factory». Реализация 2-х/3-х видов пользовательского интерфейса...

Поясните принцип работы паттерна "абстрактная фабрика"
это паттерн &quot;абстрактная фабрика &quot; .Просьба пояснить каждую строчку #include &lt;iostream&gt; class ICar // AbstractProductA { ...

2
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
28.05.2012, 21:24
Лучший ответ Сообщение было отмечено PitMagnum как решение

Решение

ну если препод так хочет абстрактных фабрик, то можно вот так поступить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class PlayersFactory
{
public:
  virtual Player* CreateFirstPlayer() const = 0;
  virtual Player* CreateSecondPlayer() const = 0;
};
 
// далее идут конкретные фабрики. имплементация у них простая. не буду писать.
class HumanHumanPlayersFactory : public PlayersFactory {};
class ComputerHumanPlayersFactory : public PlayersFactory {};
class HumanComputerPlayersFactory : public PlayersFactory {};
class ComputerComputerPlayersFactory : public PlayersFactory {};
 
// где-то конкретная фабрика все таки должна создаваться. поэтму какое-то подобие switch
// неизбежно. можно более продвинуто поступить типа сделать мапу в которой ключем будет
// режим игры, а значением - указатель на фабрику. ограничимся простым switch
 
PlayersFactory* CreatePlayersFactory(int gameMode)
{
  // тут в завимимости от режима создается и возвращается конкретная фабрика.
  // но возвращаемый указатель имеет тип базы.
  return someConcreteFactory;
};
 
main()
{
   int mode = 0;
   std::cout << "input game mode: ";
   std::cin >> mode;
 
   PlayersFactory* playersFactory = CreatePlayersFactory(mode);
   Player* firstPlayer = playersFactory->CreateFirstPlayer();
   Player* secondPlayer = playersFactory->CreateSecondPlayer();
 
   // ...
}
 
// Вот такое полусхемотичное решение.
// Нужно еще конечно не забывать удалять динамически созданные объекты, обработку неизвестных режимов и прочее.
// Но это тут не главное. Надеюсь сам принцип будет понятен.
1
3 / 3 / 0
Регистрация: 28.05.2012
Сообщений: 23
28.05.2012, 22:13  [ТС]
Спасибо DU, все предельно понятно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.05.2012, 22:13
Помогаю со студенческими работами здесь

Апкастинг и фабрика
Имеется вектор из ссылок на родительский клас. Думал использовать паттерн фабрики для его заполнения но время жизни обьектов не позволяет....

Объясните пожалуйста паттерн фабрика
Читаю С. Дьюхерста С++ Священные знания. Там объясняется фабричный метод. Вроде понятно обьект генерирует информацию о себе при этом мы...

Разработать древовидную структуру по заданию "Мебельная фабрика"
Разработать древовидную структуру по заданию. Первый уровень – это тематика задания, второй уровень продумать самостоятельно (утвердить у...

Абстрактная фабрика и Мост
Как с помощью абстрактной фабрики можно создать и сконфигурировать мост (bridge)? Я заметил между ними взаимосвязь, но ничего конкретного...

Абстрактная фабрика с generic
У меня есть 2 класса для валидации StringValidator и IntegerValidator, создание которых делегировано абстрактной фабрике. Абстрактный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru