一,工厂模式的初衷
C++中class跟object是不同的东西:
- class由程序员产生,object由程序产生。
- 你无法在执行期产生新的class,无法在编译器产生新的object。
- classes donnot have first-class status: You cannot copy a class, store it in a variable, or return it from a function.
C++中的type跟value之间也存在裂缝:value拥有type所表示的类型,但是type无法靠自身存活。采用某种技巧拿value换取正确的type,最后运用那个type产生object。这种"object-type-object"交易行为就是object factories的基石。
二,具体到Loki中Factory pattern
Loki中工厂定义如下:
- AbstractProduct指定继承体系中的基类base class
- IdentifierType是一种所谓的昵称(cookie type),用来表示继承体系中的某个型别。IdentifierType必须是有序型别,使之得以存储在实体店std::map。常用的标识符是int或者string。
- ProductCreator是用来生成对象的一个可调用体(callable entity)。这个型别必须支持operator(),并且不带参数,传回一个pointer to AbstractProduct。ProductCreator总是和一个型别标识符注册在一起。
Loki中的Factory自由度(DOF)比较大:
- 型别:不同于类型class。型别常用int,或者string。可以为一个类注册一个型别,也可以为一个类注册多个型别。对于class Geometry : public AbstractGeometry{} 继承体系。
class Box : public Geometry{}
class Cylinder : public Geometry{}
class Cone : public Geometry{}
...
class Pyramid : public Geometry{}
可以为一个类注册一个型别:
PFactory::Instance().Register( "Box", createBox );
PFactory::Instance().Register( "Cylinder", createCylinder );
PFactory::Instance().Register( "Cone", createCone );
...
PFactory::Instance().Register( "Pyramid", createPyramid );
也可以为一个类注册多个型别:
PFactory::Instance().Register( "Cube", createCube );
PFactory::Instance().Register( "BoudingBox", createBoundingBox ); - ProductCreator定义了对象创建的方式
简单函数:参数最多十五个
重载函数
多态类成员函数
模板类成员函数