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

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

Войти
Регистрация
Восстановить пароль
 
FakeMoNey
1 / 1 / 1
Регистрация: 27.11.2012
Сообщений: 24
#1

Объясните пожалуйста паттерн фабрика - C++

03.07.2013, 23:43. Просмотров 836. Ответов 2
Метки нет (Все метки)

Читаю С. Дьюхерста С++ Священные знания.
Там объясняется фабричный метод.
Вроде понятно обьект генерирует информацию о себе при этом мы не заботимся о том кто он конкретно.
Там приведен пример
Код
class Temp : public Employee {
   public:
      //...
      TempInfo *genInfo() const
         { return new TempInfo( *this ); }
      //...
};
Temp это служащий наследуемый от Employee при этом он может генерировать информацию о себе.
Код
class Employee {
   public:
      //...
      virtual HRInfo *genInfo() const = 0; // Фабричный метод
      //...
};
Код
Employee *e = getAnEmployee();
//...
HRInfo *info = e>genInfo();         // используется Фабричный метод
1)TempInfo должен быть наследником HRInfo?
2)Разве все равно не придется спросить тип служащего по какой-то внутренней информации, я имею ввиду не проще было бы ввести идентификатор(номер для типа служащего) чтобы просто определять кто он(рабочий, секретарь, водитель), хотя у разных рабочих разные поля, но тогда придется спросить о его типе как использовать объект о котором мало знаешь, чем это удобно?
3)Приведите пожалуйста пример фабрики другого плана может более наглядного, читаю теорию опыта пока мало но бездумно использовать патерны не хочу, объясните суть пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 23:43     Объясните пожалуйста паттерн фабрика
Посмотрите здесь:

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

Объясните пожалуйста - C++
Есть код : char text="In"; int a=sizeof(text); Вопрос : почему a = 3 ? ( там 2 символа вроде как )

Объясните пожалуйста - C++
Как работает эта программа? #include <iostream> using namespace std; int main() { char mas1;

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

Объясните пожалуйста - C++
объясните пожалуйста: что такое perf(k) ? Почеиу в коде именно int i=1;i<=k/2;i++ а не i<=k; i++ ? ...

Объясните, пожалуйста - C++
Всё читал, читал и никак не нашел внятного ответа на два вопроса: для чего нужна перегрузка операторов и для чего нужны виртуальные...

Объясните пожалуйста - C++
char str; int count = 0; cout << "Enter string:" << endl; cin.getline(str, 255); for (int i = 0; str; i++) { ...

объясните пожалуйста - C++
для чего нужны библиотеки stdafx.h и iomanip.h?

Объясните пожалуйста - C++
Разбор исходного текста на языке программирования. Выделение в исходном коде программы ключевых слов языка и операторов языка по словарю....

объясните пожалуйста - C++
как программировать по формуле?


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Модератор
Эксперт CЭксперт С++
7167 / 4333 / 633
Регистрация: 29.11.2010
Сообщений: 11,778
04.07.2013, 02:47     Объясните пожалуйста паттерн фабрика #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
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
 
// абстрактный класс
class Shape
{
    public:
        // чисто виртуальная функция имеет реализацию. Фигура может быть нарисована
        // ошибка, нельзя иметь реализацию внутри класса
        //virtual void draw() const = 0 { std::cout << "Draw Shape\n"; }
        // объявляем прототип чисто виртуальной функции
        virtual void draw() const = 0;
};
 
// реализация чисто виртуальной функции. Все легально
void Shape::draw() const
{
    std::cout << "Draw Shape\n";
}
 
// наследуемся от класса-протокола Shape. Треугольник является фигурой
// наследуется интерфейс функции draw.
class Triangle : public Shape
{
    public:
        // переобределяем метод draw() const. Треугольник рисуется по другому
        virtual void draw() const { std::cout << "Draw Triangle\n"; }
};
 
// Прямоугольный треугольник является треугольником.
// наследуется интерфейс и реализация по-умолчанию функции draw
class RightTriangle : public Triangle
{
    public:
        // переобределяем метод draw() const. Прямоугольный треугольник рисуется по другому
        void draw() const { std::cout << "Draw Right Triangle\n"; }
};
 
int main()
{
    //Shape *ps = new Shape;        // ошибка - класс абстрактный
    Shape *ps1 = new Triangle;      // хорошо
    ps1->draw();                    // вызовется метод Triangle::draw() const
    Shape *ps2 = new RightTriangle; // хорошо
    ps2->draw();                    // вызовется метод RightTriangle::draw() const
    ps1->Shape::draw();             // вызовется метод Shape::draw() const
    //ps2->Triangle::draw();        // ошибка, Triangle является базовым классом
                                    // RightTriangle, но не Shape
    RightTriangle rt;
    rt.Triangle::draw();            // вызовется метод Triangle::draw() const
    rt.draw();                      // вызовется метод RightTriangle::draw() const
}
То, что в main происходит осознаете?
FakeMoNey
1 / 1 / 1
Регистрация: 27.11.2012
Сообщений: 24
04.07.2013, 07:52  [ТС]     Объясните пожалуйста паттерн фабрика #3
Да это понятно, я подумал может есть магия которая позволяет переопределять тип возвращаемого значения в наследниках.
Ответ Создать тему
Опции темы

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