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

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

Восстановить пароль Регистрация
 
Мишутка1
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 47
06.05.2013, 19:00     Паттерн Builder #1
Вот у меня есть код примера реализации паттерна 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2013, 19:00     Паттерн Builder
Посмотрите здесь:

C++ Паттерн Bridge
C++ Паттерн проектирования «Фасад»
паттерн и строка C++ C++
C++ Паттерн декоратор
Паттерн стратегия C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 19:06     Паттерн Builder #2
В классе Army надо как-то исправить код так, чтобы если вдруг в продукте нет одного поля, то и его не должно быть в функции info().
Что значит эта магическая фраза? Конкретнее объяснить можно? Какого одного поля?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.05.2013, 19:15     Паттерн Builder #3
Цитата Сообщение от Мишутка1 Посмотреть сообщение
В классе Army надо как-то исправить код так, чтобы если вдруг в продукте нет одного поля, то и его не должно быть в функции info()
Сам класс Army нужно переписать, ибо если нет хоть какого либо рода войск то и вектор хранить незачем
Мишутка1
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 47
06.05.2013, 19:20  [ТС]     Паттерн Builder #4
Цитата Сообщение от ForEveR Посмотреть сообщение
Что значит эта магическая фраза? Конкретнее объяснить можно? Какого одного поля?
вот так: мы получаем же в итоге экземпляр класса Army, но у которого не все поля. Думаю это видно из методов которые реализованы в конкретных билдерах. Соответственно от меня требуют чтобы я как-то обошёл штуку в классе продукта Army, мы же сразу начнём выводить циклами, но в зависимости от условия, а надо как-то обойти эту хрень

Добавлено через 3 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
Сам класс Army нужно переписать, ибо если нет хоть какого либо рода войск то и вектор хранить незачем
во-во, вот типо того и надо, вы в точку попали
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.05.2013, 19:42     Паттерн Builder #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();
        }
    }
};
Мишутка1
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 47
06.05.2013, 19:59  [ТС]     Паттерн Builder #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();
    }
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 20:58     Паттерн Builder
Еще ссылки по теме:

C++ Паттерн Interpreter и грамматика
Паттерн Singleton C++
C++ Паттерн Embedded Value

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.05.2013, 20:58     Паттерн Builder #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);
    }
};
потом ещё хорошо бы память почистить но вам и так сойдет
Yandex
Объявления
06.05.2013, 20:58     Паттерн Builder
Ответ Создать тему
Опции темы

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