终于来写第二篇了。目前评论是0,浏览快接近70了。
由名字创建对象其实的有挺强的背景,那就是软件工程学中的对象持久性问题。本文讨论的方法也是持久性的一个可能实现。废话少说,看看C++是怎么做的。
动态创建当然要用指针。我们不希望在程序中出现硬编码:
Shape * pShape = new Circle;
那就用函数/对象包装一下。函数包装简单、高效一些。于是有Circle类的成员函数:
Shape *createInstance() {return new Circle;}
我们需要用这个函数去创建Circle对象,同时只有Circle对象创建以后才可以调用createInstance()。这是一对矛盾。解决的办法是将createInstance()写成静态函数。于是Shpae和Circle类长的是这个样子:
class Shape{
public:
virtual void Draw() = 0;
};
class Circle : public Shape{
public:
void Draw() { std::cout << "Drawing a Circle......Done" << std::endl; }
static Shape *createInstance() {return new Circle;}
};
指向createInstance()的函数指针当然要放在工厂类里面,同时要和创建对象的名字关联起来。std::map的键-值组合当然是最佳人选。我们还有如下定义:
typedef Shape *(*FactoryFunction)();
FactoryFunction就是一个指向函数的指针,而这个函数返回一个Shape *类型。如果你对FactoryFunction有疑问,可以看看关于函数指针的书。