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

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

Восстановить пароль Регистрация
 
FakeMoNey
1 / 1 / 1
Регистрация: 27.11.2012
Сообщений: 23
03.07.2013, 23:43     Объясните пожалуйста паттерн фабрика #1
Читаю С. Дьюхерста С++ Священные знания.
Там объясняется фабричный метод.
Вроде понятно обьект генерирует информацию о себе при этом мы не заботимся о том кто он конкретно.
Там приведен пример
Код
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     Объясните пожалуйста паттерн фабрика
Посмотрите здесь:

объясните пожалуйста C++
C++ объясните пожалуйста
C++ Объясните пожалуйста
Объясните пожалуйста C++
Курсовая работа Паттерн «Абстрактная фабрика/Abstract Factory» C++
Объясните пожалуйста C++
Объясните пожалуйста! C++
Объясните пожалуйста C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,416
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
Сообщений: 23
04.07.2013, 07:52  [ТС]     Объясните пожалуйста паттерн фабрика #3
Да это понятно, я подумал может есть магия которая позволяет переопределять тип возвращаемого значения в наследниках.
Yandex
Объявления
04.07.2013, 07:52     Объясните пожалуйста паттерн фабрика
Ответ Создать тему
Опции темы

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