Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
PitMagnum
3 / 3 / 0
Регистрация: 28.05.2012
Сообщений: 17
#1

Абстрактная фабрика - C++

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

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

Код
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'ом:

Код
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 это плохо и нечитабельно (хотя по мне, так все предельно понятно).

Я понимаю, что из себя представляет фабричный метод и что такое абстрактная фабрика, но концы с концами свести не могу - запутался. Помогите, пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 20:53     Абстрактная фабрика
Посмотрите здесь:

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

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

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

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

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

Шаблон Абстрактная фабрика в Android Studio - Программирование Android
Доброго дня Пытаюсь разобраться как проектировать шаблон Абстрактная фабрика и похоже что-то идёт не так. За основу взял пример из сети с...

.NET 4.x Паттерн "Абстрактная фабрика" - C#
Есть абстрактный класс Factory: public abstract class Factory { protected string _login; protected string...

Абстрактная активити - Программирование Android
Здравствуйте. Хочу сделать активити для входа в приложение (ввод логина, пароля, проверка этого всего на сервере и т.д.). И хочу...

Всплывашка (абстрактная data-*===id) - jQuery
Добрый день! Хочу реализовать конструкция, которая будет добавлять по клику на ссылку определённый класс диву, а при чём у ссылки и у...

Абстрактный класс и абстрактная функция - C#
Зачем нужен абстрактный класс - понятно, зачем нужен виртуальный метод - тоже. Но зачем нужен абстрактный метод? Или правильно ли я...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.05.2012, 21:24     Абстрактная фабрика #2
ну если препод так хочет абстрактных фабрик, то можно вот так поступить:
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();
 
   // ...
}
 
// Вот такое полусхемотичное решение.
// Нужно еще конечно не забывать удалять динамически созданные объекты, обработку неизвестных режимов и прочее.
// Но это тут не главное. Надеюсь сам принцип будет понятен.
PitMagnum
3 / 3 / 0
Регистрация: 28.05.2012
Сообщений: 17
28.05.2012, 22:13  [ТС]     Абстрактная фабрика #3
Спасибо DU, все предельно понятно
Yandex
Объявления
28.05.2012, 22:13     Абстрактная фабрика
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru