我们可以用因子类中的普通成员函数来做,也可以用工厂的指针变量来访问,请问有什么不同吗?
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();
}
静态方法不是必须的,但只要不使用类中的非静态成员,方法就可以是 static
.
为什么我们在工厂设计模式中真的需要静态功能?
没有这样的要求。如果你这样实现,你就可以随心所欲地做这个事情。
但是你应该想到。
如果你必须创建一个没有实例数据的工厂对象 为什么我们要白白地拥有那个实例?这只会浪费内存,因为根据定义,一个实例的大小总是大于零。
在这种情况下,把它变成单例是特别没有帮助的,因为我们不能保证我们只有一个我们仍然不需要的实例。而且单例的坏处是,它通常会在每次调用时检查是否已经被实例化,这就浪费了额外的资源。
一般来说,不仅是工厂,如果一个类只是用来结构化代码,不包含任何数据,所有的方法都可以是静态的。即使一个类有数据成员,但这个类的单个方法没有使用任何成员,也可以将其静态化,因为这样可以避免将这个指针推到堆栈上而不被使用(也许编译器会优化这个指针)。
没有唯一的工厂模式,也没有唯一的实现方案。但如果参考典型的GOF工厂模式,它不仅仅是创建一个对象。GOF工厂能够让你根据工厂的活动实例来创建不同的对象。工厂模式的理念不是像你的enum那样在选择器变量上创建不同的对象,而是通过保持接口不变,根据工厂的实例创建完整的对象集。在你的例子中,你完全忽略了这一点。而你这样做了,它仍然不需要任何数据,这使得你的类是空的,作为这个所有方法都应该是静态的。如果你使用GOF模式,你至少有vtable指针作为数据成员和虚拟方法的创建方法。