Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните пожалуйста паттерн фабрика 
:(
    Опции темы
Pro100MoNEy
Дата 3.7.2013, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.11.2010

Репутация: нет
Всего: нет



Читаю С. Дьюхерста С++ Священные знания.
Там объясняется фабричный метод.
Вроде понятно обьект генерирует информацию о себе при этом мы не заботимся о том кто он конкретно.
Там приведен пример
Код
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)Приведите пожалуйста пример фабрики другого плана может более наглядного, читаю теорию опыта пока мало но бездумно использовать патерны не хочу, объясните суть пожалуйста.
PM MAIL   Вверх
xvr
Дата 4.7.2013, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Pro100MoNEy @  3.7.2013,  22:43 Найти цитируемый пост)
1)TempInfo должен быть наследником HRInfo?

Да

Цитата(Pro100MoNEy @  3.7.2013,  22:43 Найти цитируемый пост)
2)Разве все равно не придется спросить тип служащего по какой-то внутренней информации,

Ну собственно HRInfo это он и есть. В идеале при использовании полиморфизма нам вообще не надо знать конкретный тип служащего, любой наследник Employee должен сам знать о себе все, что надо. А мы должны знать только то, что доступно через базовый класс Employee 

Цитата(Pro100MoNEy @  3.7.2013,  22:43 Найти цитируемый пост)
3)Приведите пожалуйста пример фабрики другого плана может более наглядного, 

Например, вы делаете библиотеку для вычисления выражений, заданных в виде строки (пусть это будет встраиваемый куда то интерпретатор). И вы хотите дать возможность пользователю этой библиотеки добавлять в нее любые функции (по имени). Библиотека выдает из строки дерево разбора (AST). Вы заводите абстрактный узел для функции -
Код

class ASTNode {
...
public:
 virtual ASTValue evaluate() =0;
};

class ASTFunction : public ASTNode {
public:
 virtual void add_argument(ASTNode*) =0;
};

И делаете класс фабрики (с именем)
Код

class FunctionFabric {
 static FunctionFabric* root;
 FunctionFabric* next;
 const char* name;
public:
 FunctionFabric(const char* n) : name(n)
  {
   next=root;
   root=this;
  }
 virtual ASTFunction* create() =0;
 static ASTFunction* make(const char* nm)
   {
     for(FunctionFabric* f=root;f;f=f->next)
      if (strcmp(nm,f->name)==0) return f->create();
     return NULL;
   }
};
А что бы еще упростить жизнь пользователю вашей библиотеки делаете такой шаблонный класс и макрос:
Код

template<class Func>
class FuncReg : public FunctionFabric {
public:
 FuncReg(const char* n) : FunctionFabric(n) {}
 ASTFunction* create() {return new Func;}
}; 
#define FUNCREG(nm) static FuncReg<FUNC_##nm> local_static_registrar_##nm(#nm)
После этого добавление новой функции пользователем выглядит элементарно (например добавим 'sin'):
Код

class FUNC_sin : public ASTFunction {
...
};
FUNCREG(sin);
Ну и создание функции в библиотеке
Код

ASTFunction* func = FunctionFabric::make("sin");




Это сообщение отредактировал(а) xvr - 4.7.2013, 09:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0783 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.