Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org
В обьектно-ориентированном программировании существуют несколько общеизвестных хитрых алгоритмов использования возможностей ООП . Изощренное наследование , полиморфизм позволяют компактно порождать сложные обьекты там , где при стандартных подходах это делается более трудоемкими способами .

Abstract factory

Рассмотрим один из таких подходов . С его помощью мы смоделируем животный мир 2-х континентов и взаимодействие видов внутри каждого из них . Класс X - это хищники , класс ML - млекопитающие .
 class Ml
 {
 };
 
 class X
 {
 public:
     virtual void Eat( const Ml & ml ) = 0;
 };
 
 class Antilopa : public Ml
 {
 };
 
 class Lion : public X
 {
 public:
     void Eat( const Ml & ml )
     {
        printf("Lion eats something " );
     }
 };
 
 class Bizon : public Ml
 {
 };
 
 class Wolf : public X
 {
 public:
     void Eat( const Ml & ml )
     {
         printf("Wolf eats something" );
     }
 };
 
 class Continent
 {
 public:
     virtual X  *  create_x()  const = 0;
     virtual Ml *  create_ml() const = 0;
 };
 
 class Africa : public Continent
 {
 public:
     Ml * create_ml() const
     {
         return new Antilopa();
     }
     X * create_x() const
     {
         return new Lion();
     }
 };
 
 class America : public Continent
 {
 public:
    Ml * create_ml() const
    {
       return new Bizon();
    }
    X * create_x() const
    {
       return new Wolf();
   }
 };
 
 class AnimalWorld
 {
 private : Ml & ml;
 private : X & x;
 
 public:
     AnimalWorld( const Continent & continent ) :
        x (*continent.create_x()),
        ml (*continent.create_ml())
     {
     }
 
 public:
     void RunFoodChain()
     {
        x.Eat(ml);
     }
 };
 
 
 int main()
 {
 
   Continent *africa  = new Africa();
   AnimalWorld *world = new AnimalWorld( *africa );
   world->RunFoodChain();
 
   Continent *america  = new America();
   world = new AnimalWorld( *america );
   world->RunFoodChain();
 
   return 0 ;
 }
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье