Почему нам действительно нужна функция stati c в шаблоне проектирования Factory? - PullRequest
0 голосов
/ 05 мая 2020

мы можем сделать то же самое с нормальной функцией-членом в классе факторов и можем получить доступ с помощью переменной указателя фабрики? Подскажите, пожалуйста, в чем разница.

enum shapeType
{
    CIRCLE_TYPE,
    RECTANGLE_TYPE,
    SQUARE_TYPE
};

class Shape
{
    public:
    virtual void draw()=0;
    virtual ~Shape(){

    }
};

class Rectangle:public Shape
{
    public:
    void draw()
    {
        cout<<" draw rectangle"<<endl;
    }
};

class Square:public Shape
{
    public:
    void draw()
    {
        cout<<" draw square"<<endl;
    }
};

class Circle:public Shape
{
    public:
    void draw()
    {
        cout<<" draw circle"<<endl;
    }

};



 class Factory //comes with library
    {
        public:
          /*  static Shape *getObject(shapeType type)
            {
                if (type == CIRCLE_TYPE)
                    return new Circle;
                if (type == RECTANGLE_TYPE)
                    return new Rectangle;
                if (type == SQUARE_TYPE)
                    return new Square;
            }*/

      Shape* getShapeType(shapeType type)
        {
               if(type==CIRCLE_TYPE)
                  return new Circle;
               if(type==RECTANGLE_TYPE)
                  return new Rectangle;
               if(type==SQUARE_TYPE)
                  return new Square;

        }

    };

int main()
{   
    Factory *accesFact;
    Shape* obj1=accesFact->getShapeType(RECTANGLE_TYPE);
    obj1->draw();
}

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

почему нам действительно требуется функция stati c в шаблоне проектирования Factory?

Подобных требований нет. Если вы реализуете это таким образом, вы можете делать это как хотите.

Но вы должны подумать о:

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

Сделать его синглтоном особенно бесполезно в этом случае, поскольку мы гарантируем, что у нас есть только один экземпляр, которого мы все еще не необходимость. И плохая сторона синглтона заключается в том, что он обычно проверяет каждый вызов, если он уже создан, что приводит к потере дополнительных ресурсов. код и не содержит данных, все методы могут быть c. Даже если у класса есть элементы данных, но один метод такого класса не использовал ни один из этих членов, сделайте его stati c, так как это позволяет избежать помещения указателя this в стек без какого-либо использования (возможно, компилятор оптимизирует это. ).

Не существует ни единого заводского шаблона, ни единственного варианта реализации. Но если вы обратитесь к типичному шаблону фабрики GOF, есть нечто большее, чем просто создание объекта. Фабрика GOF позволяет создавать различные объекты в зависимости от активного экземпляра фабрики. Идея шаблона фабрики не в создании различных объектов в переменной-селекторе, такой как ваше перечисление, а в создании полных наборов объектов в зависимости от экземпляра фабрики, сохраняя интерфейс одинаковым. Вы полностью упустили это в своем примере. И, как и вы, по-прежнему не требовалось никаких данных, которые делали бы ваш класс пустым, и поэтому все методы должны быть stati c. Если вы используете шаблон GOF, у вас есть как минимум указатель vtable как член данных и виртуальные методы для методов создания.

0 голосов
/ 05 мая 2020
Метод

Stati c не является обязательным, но до тех пор, пока вы не используете нестатические c члены класса, метод может быть static.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...