Пример реализации паттерна ООП Абстрактная фабрика инструментами MQL5 - страница 2

 
Dmitry Fedoseev:

А в чем смысл? Что теперь с этим делать?

Написано же - "пример". То есть, "это" надо разобрать, понять, как работает, и прикинуть, как использовать для своих нужд.

 
George Merts:

Написано же - "пример". То есть, "это" надо разобрать, понять, как работает, и прикинуть, как использовать для своих нужд.


В чем собственно заключается эта "фабрика"? В том, что один объект может включать несколько полиморфных объекта другого класса? 

Вот патерн сингельтон - это нечто, это действительно крутой финт, даже во сне не приснится. А в чем крутизна фабрики? Мне кажется это само собой разумеется и очевидно, что один объект может содержать другие объекты.

 

Посидел немного, вот так сделал:

#property copyright "Copyright у братьев Райт"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


class CBottle{
   public:
   virtual string Type(){
      return("");
   }
};
class CRoundBottle:public CBottle{
   public:
   string Type(){
      return("round bottle");
   }
};
class CSquaredBottle:public CBottle{
   public:
   string Type(){
      return("square bottle");
   }
};

//===

class CDrink{
   public:
   virtual string Type(){
      return("");
   }   
};
class CJuice:public CDrink{
   public:
   string Type(){
      return("juice");
   }
};
class CSoda:public CDrink{
   public:
   string Type(){
      return("soda");
   }
};

//===

class CFilledBottle{
   protected:
      CBottle * m_bottle;
      CDrink * m_drink;
   public:
      string Type(){
         return m_bottle.Type()+" with "+m_drink.Type();
      }
   
      void CFilledBottle(CBottle * bottle,CDrink * drink){
         m_bottle=bottle;
         m_drink=drink;
      }
      void ~CFilledBottle(){
         if(CheckPointer(m_bottle)==POINTER_DYNAMIC)delete m_bottle;
         if(CheckPointer(m_drink)==POINTER_DYNAMIC)delete m_drink;
      }
      
      string Bottle(){
         return m_bottle.Type();
      }
      
};

//===

class CFactory{
   public:
   CBottle * RoundBottle(){
      return new  CRoundBottle;
   }
   CBottle * SquaredBottle(){
      return new  CSquaredBottle;
   }   
   CDrink * Juice(){
      return new  CJuice;
   }      
   CDrink * Soda(){
      return new  CSoda;
   }       
};


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){

   CFactory factory;
   
   CFilledBottle bottle1(factory.RoundBottle(),factory.Juice());
   CFilledBottle bottle2(factory.RoundBottle(),factory.Soda());
   CFilledBottle bottle3(factory.SquaredBottle(),factory.Juice());
   CFilledBottle bottle4(factory.SquaredBottle(),factory.Soda());   
   
   
   Alert("1: ",bottle1.Type());
   Alert("2: ",bottle2.Type());   
   Alert("3: ",bottle3.Type());   
   Alert("4: ",bottle4.Type());   
   

}
//+------------------------------------------------------------------+

Это фабрика или не фабрика?

 
Dmitry Fedoseev:

В чем собственно заключается эта "фабрика"? В том, что один объект может включать несколько полиморфных объекта другого класса? 

Вот патерн сингельтон - это нечто, это действительно крутой финт, даже во сне не приснится. А в чем крутизна фабрики? Мне кажется это само собой разумеется и очевидно, что один объект может содержать другие объекты.

Дмитрий, для профессионала конечно всё это очевидно. Но если начинающий программист смог в этом разобраться и считает, что может быть кому-то это поможет, то почему-бы не опубликовать это?
 
Alexey Viktorov:
Дмитрий, для профессионала конечно всё это очевидно. Но если начинающий программист смог в этом разобраться и считает, что может быть кому-то это поможет, то почему-бы не опубликовать это?

Вы пытались читать книги про эти паттерны? Такое впечатление, что эти книги выдали, что бы куча начинающих программистов на них застряла и самоликвидировалась. Потому-что там и опытным не все сразу очевидно. А когда разберешься, возникает вопрос - а стоило ли так трахать мозги? - Вот собственно о чем мой вопрос.

Я так до сих пор и не понял, что же называют фабрикой. Если фабрика это объект включающих другие полиморфные объекты  -  то, как видите, что такое фабрика, объясняется одним предложением.

А может быть фабрикой является исключительно вот этот класс:

class CFactory{
   public:
   CBottle * RoundBottle(){
      return new  CRoundBottle;
   }
   CBottle * SquaredBottle(){
      return new  CSquaredBottle;
   }   
   CDrink * Juice(){
      return new  CJuice;
   }      
   CDrink * Soda(){
      return new  CSoda;
   }       
};

Здесь тоже можно объяснить, что такое фабрика, одним предложением. А начнешь читать книги и статьи, ум за разум заходит.

А если посмотреть как общаются между собой эти адепты паттернов, прям избранные, на каком-то особом языке... не вздумай рядом подойти.

===

То, что кто-то одолел, разобрался и выложил - замечательно. Теперь как раз видим, что фактически это не то, что скрывалось за напыщенной оберткой.

 
Dmitry Fedoseev:

Вы пытались читать книги про эти паттерны? Такое впечатление, что эти книги выдали, что бы куча начинающих программистов на них застряла и самоликвидировалась. Потому-что там и опытным не все сразу очевидно. А когда разберешься, возникает вопрос - а стоило ли так трахать мозги? - Вот собственно о чем мой вопрос.

То, что кто-то одолел, разобрался и выложил - замечательно. Теперь как раз видим, что фактически это не то, что скрывалось за напыщенной оберткой.


В свое время мне понравилась книга - Сергей Тепляков «Паттерны проектирования на платформе .NET» Питер, 2015 год
Как, зачем, когда, разные варианты и подходы в примерах к тому же с UML диаграммами.
Доступна по ссылке - https://cloud.mail.ru/public/2qT4/y2U22r9bU


Если кратко то есть три близких по названию но абсолютно разных по наполнению паттерна, и их все-таки не стоит путать:
- абстрактная фабрика (Abstract Factory) - порождающий патерн
- фабричный метод (Factory Method) - порождающий патерн
- шаблонный метод (Template Method) - паттерн поведения


Паттерны классная вещь, если не перегибать.
Например, один из модулей в проекте парсит входящие invoice счета и возможны 3 исторические версии счетов в различных форматах (txt, csv, ....) в общем 12 крайних вариантов.
Как кратко, в двух словах,  описать архитектуру не вникая в ненужные детали реализаций?
Очень просто: используется "стратегия" для выбора нужного парсера под конкретный тип счета, а для обработки счета выбранным классом парсера применяется "шаблонный метод". 

 
Dmitry Fedoseev:

Вы пытались читать книги про эти паттерны? Такое впечатление, что эти книги выдали, что бы куча начинающих программистов на них застряла и самоликвидировалась. Потому-что там и опытным не все сразу очевидно. А когда разберешься, возникает вопрос - а стоило ли так трахать мозги? - Вот собственно о чем мой вопрос.

Я так до сих пор и не понял, что же называют фабрикой. Если фабрика это объект включающих другие полиморфные объекты  -  то, как видите, что такое фабрика, объясняется одним предложением.

Ну, не знаю о каких книгах речь, а на мой взгляд, паттерны обычно описываются на достаточно простых примерах, как раз чтобы не "трахать мозги".

Смысл паттернов в том, чтобы иметь под рукой ("в голове") способы решения типовых программистских задач (таких как создание объектов разного типа - что делает фабрика; она удобна, если объекты сборные или, например, имеют ограничения доступа). Можно назвать сбор паттернов аналогом библиотеки шаблонов STL в плоскости объектного дизайна, а не расчетного алгоритма. Самое интересное, что паттерны можно и не учить, а просто пытаться программировать - может быть постепенно, от раза к разу все более коротко, емко и эффективно с помощью рефакторинга - и в результате получить код, который - неким магическим образом, оказывается - соответствует одному из известных паттернов. В общем, паттерны потому так и называются, что как ни программируй, а некие общие приемы по-любому выкристаллизуются в коде. Кроме того, при работе в команде удобно обмениваться идеями с названиями паттернов. Это своего рода словесная блоксхема программы.

Но, я согласен, что в программировании иногда встречаются любители извратить концепцию до такой степени, что программирование как-будто используется ради самого программирования, вырождаясь в малопонятную тарабарщину. Тут каждый волен выбирать свой путь - пытаться подтянуть свой уровень до этих гуру (и в конце понять, гуру ли они на самом деле) или успешно реализовывать задуманное в соответствии с личными предпочтениями.

 
Dmitry Fedoseev:
 

Я так до сих пор и не понял, что же называют фабрикой. Если фабрика это объект включающих другие полиморфные объекты  -  то, как видите, что такое фабрика, объясняется одним предложением.

А может быть фабрикой является исключительно вот этот класс:

Здесь тоже можно объяснить, что такое фабрика, одним предложением. А начнешь читать книги и статьи, ум за разум заходит.

Согласен, классическая фабрика - это просто класс, который создает другие объекты по оператору new.

Однако, я не согласен, что приведенный пример - бесполезен. Как раз для начинающих он очень даже хорошо иллюстрирует понятия наследования и (в меньшей степени) - полиморфизма.

По сути, это просто "драматизация идеи" - просто яркий (за счет забавных названий) пример, который легко и интересно разбирать начинающему. Не стоит от него ждать больше.

 
George Merts:

Согласен, классическая фабрика - это просто класс, который создает другие объекты по оператору new.

Однако, я не согласен, что приведенный пример - бесполезен. Как раз для начинающих он очень даже хорошо иллюстрирует понятия наследования и (в меньшей степени) - полиморфизма.

По сути, это просто "драматизация идеи" - просто яркий (за счет забавных названий) пример, который легко и интересно разбирать начинающему. Не стоит от него ждать больше.


Я не писал, что он бесполезен, даже не намекал и даже не думал так. Он полезен. Я намекал на то, что тема паттернов программирования излишне мистифицирована.

Причина обращения: