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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
PitMagnum
3 / 3 / 0
Регистрация: 28.05.2012
Сообщений: 16
28.05.2012, 20:53     Абстрактная фабрика #1
Здравствуйте, у меня проблема следующего рода. Есть абстрактный класс 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++
Курсовая работа: Паттерн «Абстрактная фабрика»
C++ Объясните пожалуйста паттерн фабрика
C# Реализовать каркас для паттернов Абстрактная фабрика и Мост
Поясните принцип работы паттерна "абстрактная фабрика" C++
Абстрактная фабрика и Мост
C++ Разработать древовидную структуру по заданию "Мебельная фабрика"
Android Абстрактная активити

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 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
Сообщений: 16
28.05.2012, 22:13  [ТС]     Абстрактная фабрика #3
Спасибо DU, все предельно понятно
Yandex
Объявления
28.05.2012, 22:13     Абстрактная фабрика
Ответ Создать тему
Опции темы

Текущее время: 13:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru