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

问题描述 投票:-2回答:1

我们可以用因子类中的普通成员函数来做,也可以用工厂的指针变量来访问,请问有什么不同吗?

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();
}
c++ design-patterns factory
1个回答
0
投票

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


2
投票

为什么我们在工厂设计模式中真的需要静态功能?

没有这样的要求。如果你这样实现,你就可以随心所欲地做这个事情。

但是你应该想到。

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

在这种情况下,把它变成单例是特别没有帮助的,因为我们不能保证我们只有一个我们仍然不需要的实例。而且单例的坏处是,它通常会在每次调用时检查是否已经被实例化,这就浪费了额外的资源。

一般来说,不仅是工厂,如果一个类只是用来结构化代码,不包含任何数据,所有的方法都可以是静态的。即使一个类有数据成员,但这个类的单个方法没有使用任何成员,也可以将其静态化,因为这样可以避免将这个指针推到堆栈上而不被使用(也许编译器会优化这个指针)。

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

© www.soinside.com 2019 - 2024. All rights reserved.