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

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

Войти
Регистрация
Восстановить пароль
 
Мишутка1
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 47
#1

Паттерн Builder - C++

06.05.2013, 19:00. Просмотров 726. Ответов 6
Метки нет (Все метки)

Вот у меня есть код примера реализации паттерна Builder(другие примеры не предлагать). В классе Army надо как-то исправить код так, чтобы если вдруг в продукте нет одного поля, то и его не должно быть в функции info(). Спасибо заранее за советы
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
  
// Классы всех возможных родов войск
class Infantryman
{
  public:
    void info() { 
      cout << "Infantryman" << endl; 
    }
};
  
class Archer
{
  public:
    void info() { 
      cout << "Archer" << endl; 
    }
};
  
class Horseman
{
  public:        
    void info() { 
      cout << "Horseman" << endl; 
    }
};
  
class Catapult
{
  public:    
    void info() { 
      cout << "Catapult" << endl; 
    }
};
  
class Elephant
{
  public:    
    void info() { 
      cout << "Elephant" << endl; 
    }
};
  
  
// Класс "Армия", содержащий все типы боевых единиц
class Army 
{
  public:
    vector<Infantryman> vi; 
    vector<Archer>      va; 
    vector<Horseman>    vh;     
    vector<Catapult>    vc;     
    vector<Elephant>    ve; 
    void info() {   
      int i;
      for(i=0; i<vi.size(); ++i)  vi[i].info();
      for(i=0; i<va.size(); ++i)  va[i].info();
      for(i=0; i<vh.size(); ++i)  vh[i].info();
      for(i=0; i<vc.size(); ++i)  vc[i].info();
      for(i=0; i<ve.size(); ++i)  ve[i].info();
    }
};
  
  
// Базовый класс ArmyBuilder объявляет интерфейс для поэтапного 
// построения армии и предусматривает его реализацию по умолчанию
 
class ArmyBuilder
{
  protected: 
    Army* p;
  public:    
    ArmyBuilder(): p(0) {}
    virtual ~ArmyBuilder() {}
    virtual void createArmy() {}
    virtual void buildInfantryman() {}
    virtual void buildArcher() {}
    virtual void buildHorseman() {}
    virtual void buildCatapult() {}
    virtual void buildElephant() {}    
    virtual Army* getArmy() { return p; }    
};
  
  
// Римская армия имеет все типы боевых единиц кроме боевых слонов
class RomanArmyBuilder: public ArmyBuilder
{    
  public:    
    void createArmy() { p = new Army; }
    void buildInfantryman() { p->vi.push_back( Infantryman()); }
    void buildArcher() { p->va.push_back( Archer()); }
    void buildHorseman() { p->vh.push_back( Horseman()); }    
    void buildCatapult() { p->vc.push_back( Catapult()); }
};
  
  
// Армия Карфагена имеет все типы боевых единиц кроме катапульт
class CarthaginianArmyBuilder: public ArmyBuilder
{    
  public:    
    void createArmy() { p = new Army; }
    void buildInfantryman() { p->vi.push_back( Infantryman()); }
    void buildArcher() { p->va.push_back( Archer()); }
    void buildHorseman() { p->vh.push_back( Horseman()); }
    void buildElephant() { p->ve.push_back( Elephant()); }    
};
  
  
// Класс-распорядитель, поэтапно создающий армию той или иной стороны.
// Именно здесь определен алгоритм построения армии.
class Director
{    
  public:    
    Army* createArmy( ArmyBuilder & builder ) 
    { 
        builder.createArmy();
        builder.buildInfantryman();
        builder.buildArcher();
        builder.buildHorseman();
        builder.buildCatapult();
        builder.buildElephant();
        return( builder.getArmy());
    }
};
  
  
int main()
{   
    Director dir;
    RomanArmyBuilder ra_builder;
    CarthaginianArmyBuilder ca_builder;
     
    Army * ra = dir.createArmy( ra_builder);
    Army * ca = dir.createArmy( ca_builder);
    cout << "Roman army:" << endl;
    ra->info();
    cout << "\nCarthaginian army:" << endl;
    ca->info();
    // ...
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2013, 19:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Паттерн Builder (C++):

паттерн и строка C++ - C++
Возникла необходимость производить поиск в строке по паттерну, который может содержать символ '*' и '?'.Например: искать в строке &quot;abcdefg&quot;...

Паттерн стратегия - C++
Всем привет! Начал изучать паттерны. Одним из наиболее понятных и интересных мне оказался паттерн Стратегия. Я начитался статей и...

Паттерн декоратор - C++
доброго времени суток уважаемые форумчане, помогите пожалуйста разобраться, где я допустил ошибку? суть программы в том что бы слова...

Паттерн Singleton - C++
Здравствуйте. Например есть класический одиночка и загрузка музыки. Возможно ли сделать загрузку и вопроизведение музыки через класс...

Паттерн Bridge - C++
нужно написать аудиоплеер, используя паттерн Bridge, с помощью которого надо реализовать возможность смены интерфейса. с паттернами я не в...

Паттерн Singleton - C++
Мне вот дали такой код как паттерн Singleton: #include &quot;stdafx.h&quot; template &lt;class T&gt; class SingletonS { static int...

6
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.05.2013, 19:06 #2
В классе Army надо как-то исправить код так, чтобы если вдруг в продукте нет одного поля, то и его не должно быть в функции info().
Что значит эта магическая фраза? Конкретнее объяснить можно? Какого одного поля?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.05.2013, 19:15 #3
Цитата Сообщение от Мишутка1 Посмотреть сообщение
В классе Army надо как-то исправить код так, чтобы если вдруг в продукте нет одного поля, то и его не должно быть в функции info()
Сам класс Army нужно переписать, ибо если нет хоть какого либо рода войск то и вектор хранить незачем
1
Мишутка1
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 47
06.05.2013, 19:20  [ТС] #4
Цитата Сообщение от ForEveR Посмотреть сообщение
Что значит эта магическая фраза? Конкретнее объяснить можно? Какого одного поля?
вот так: мы получаем же в итоге экземпляр класса Army, но у которого не все поля. Думаю это видно из методов которые реализованы в конкретных билдерах. Соответственно от меня требуют чтобы я как-то обошёл штуку в классе продукта Army, мы же сразу начнём выводить циклами, но в зависимости от условия, а надо как-то обойти эту хрень

Добавлено через 3 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
Сам класс Army нужно переписать, ибо если нет хоть какого либо рода войск то и вектор хранить незачем
во-во, вот типо того и надо, вы в точку попали
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.05.2013, 19:42 #5
Цитата Сообщение от Мишутка1 Посмотреть сообщение
во-во, вот типо того и надо, вы в точку попали
ну так объедени все типы войск общим интерфейсом IFightingArm с методом info, а в Army сделать что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Army 
{
public:
    vector<vector<IFightingArm*> > mArms;
    
    void info() {   
        for (size_t i = 0; i < mArms.size(); ++i)
        {
            for (size_t j = 0; j < mArms[i].size(); ++j)
                mArms[i][j]->info();
        }
    }
};
0
Мишутка1
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 47
06.05.2013, 19:59  [ТС] #6
Цитата Сообщение от Jupiter Посмотреть сообщение
ну так объедени все типы войск общим интерфейсом IFightingArm с методом info, а в Army сделать что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Army 
{
public:
    vector<vector<IFightingArm*> > mArms;
    
    void info() {   
        for (size_t i = 0; i < mArms.size(); ++i)
        {
            for (size_t j = 0; j < mArms[i].size(); ++j)
                mArms[i][j]->info();
        }
    }
};
вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class IFightingArm
{
public:
vector <Infantryman> a;
vector <Archer> b;
vector <Horseman> c;
vector <Catapult> d;
vector <Elephant> e;
    void info()
    {
      int i;
      for(i=0; i<a.size(); ++i)  a[i].info();
      for(i=0; i<b.size(); ++i)  b[i].info();
      for(i=0; i<c.size(); ++i)  c[i].info();
      for(i=0; i<d.size(); ++i)  d[i].info();
      for(i=0; i<e.size(); ++i)  e[i].info();
    }
};
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.05.2013, 20:58 #7
Цитата Сообщение от Мишутка1 Посмотреть сообщение
вот так
нет бл...
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
class IFightingArm
{
public:
    virtual void info() const = 0;
    virtual ~IFightingArm() { }
};
 
class Infantryman : public IFightingArm
{
public:
    void info() const { 
        cout << "Infantryman" << endl; 
    }
};
 
class Archer : public IFightingArm
{
public:
    void info() const { 
        cout << "Archer" << endl; 
    }
};
 
class Horseman : public IFightingArm
{
public:        
    void info() const { 
        cout << "Horseman" << endl; 
    }
};
 
class Catapult : public IFightingArm
{
public:    
    void info() const { 
        cout << "Catapult" << endl; 
    }
};
 
class Elephant : public IFightingArm
{
public:    
    void info() const { 
        cout << "Elephant" << endl; 
    }
};
 
class Army 
{
public:
    vector<vector<IFightingArm*> > mArms;
    
    void info() const {   
        for (size_t i = 0; i < mArms.size(); ++i)
        {
            for (size_t j = 0; j < mArms[i].size(); ++j)
                mArms[i][j]->info();
        }
    }
};
 
class ArmyBuilder
{
protected: 
    Army* p;
public:    
    ArmyBuilder(): p(0) {}
    virtual ~ArmyBuilder() {}
    virtual void createArmy() {}
    virtual void buildInfantryman() {}
    virtual void buildArcher() {}
    virtual void buildHorseman() {}
    virtual void buildCatapult() {}
    virtual void buildElephant() {}    
    virtual Army* getArmy() { return p; }    
};
 
class RomanArmyBuilder : public ArmyBuilder
{    
public:    
    void createArmy() { p = new Army; }
    void buildInfantryman() 
    { 
        vector<IFightingArm*> vec;
        vec.push_back(new Infantryman());
        p->mArms.push_back(vec);
    }
    
    void buildArcher() 
    { 
        vector<IFightingArm*> vec;
        vec.push_back(new Archer());
        p->mArms.push_back(vec);
    }
 
    void buildHorseman() 
    { 
        vector<IFightingArm*> vec;
        vec.push_back(new Horseman());
        p->mArms.push_back(vec);
    }    
 
    void buildCatapult() 
    { 
        vector<IFightingArm*> vec;
        vec.push_back(new Catapult());
        p->mArms.push_back(vec);
    }
};
потом ещё хорошо бы память почистить но вам и так сойдет
1
06.05.2013, 20:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 20:58
Привет! Вот еще темы с ответами:

Паттерн Embedded Value - C++
Доброго времени суток, вопрос по паттерну Embedded Value (объединенное свойство). Это тема моей курсовой, нашел про него немного теории, да...

Паттерн Interpreter и грамматика - C++
Может не особо по теме C++, но все же. Столкнулся с некоторой трудностью. Читал про паттерн Interpreter, который, вроде как , служит для...

Singleton. Одиночка. Паттерн - C++
Как реализовать паттерн Singleton на C++? Делаю так: Заголовочный файл: class Play { private: Play(void); ~Play(void);

Паттерн проектирования «Фасад» - C++
Здравствуйте. Можете по простому объяснить про паттерн проектирования «Фасад», его плюсы, минусы, для чего он...Читая на различных сайтах...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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