为什么我们真的需要工厂设计模式中的静态函数?

why do we really require static function in factory design pattern?

我们可以对因子中的普通成员函数做同样的事情 class 并且可以使用工厂指针变量访问?谁能告诉我区别吗

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();
}

静态方法不是必须的,但是只要不使用class的非静态成员,方法就可以static.

why do we really require static function in factory design pattern?

没有这样的要求。如果你那样实现它,你可以随心所欲地做到这一点。

但你应该想到:

如果你必须创建一个没有实例数据的工厂对象,为什么我们要白白拥有那个实例?它只会浪费内存,因为根据定义,实例的大小总是大于零。

在这种情况下使其成为单例尤其没有帮助,因为我们保证只有一个我们仍然不需要的实例。单例的不好的一面是,它通常会检查每个调用是否已经实例化,这会浪费额外的资源。

一般来说,不仅仅是工厂,如果一个class只是用来构造代码,不包含任何数据,那么所有的方法都可以是静态的。即使 class 有数据成员,但这样的 class 的单个方法没有使用任何成员,将其设置为静态的,因为这样可以避免在没有任何使用的情况下将 this 指针推入堆栈(也许编译器会对此进行优化)。

没有唯一的工厂模式,也没有唯一的实现选项。但是如果你参考典型的 GOF 工厂模式,那么不仅仅是创建一个对象。 GOF 工厂使您能够根据工厂的活动实例创建不同的对象。工厂模式的想法不是像枚举那样在选择器变量上创建不同的对象,而是通过保持接口相同来根据工厂实例创建完整的对象集。你在你的例子中完全错过了。正如您所做的那样,它仍然不需要任何使您的 class 为空的数据,因此所有方法都应该是静态的。如果你使用 GOF 模式,你至少有 vtable 指针作为数据成员和用于创建方法的虚拟方法。