当子类很多,而且命名复杂时,我们并不确切的知道子类的名称。或者原先的我们只是在fruit类的构造函数中传递一个type,并没有派生出相应的子类而现在由于某种原因需要用到派生子类时 ,我们就可以用到Factory模式了。fruit* p=new orange();
其核心思想是封装创建具体子类的实现!
如下图1和图2所示。两个之间的差异是在图2的思路中在factory只是提供创建对象的接口,具体实现创建哪个子类product则在factory的相应子类中实现。
Factory模式带来的一些问题:
1.如果为每种具体的product创建一个创建函数,则我们不得不在factory中添加新的创建函数或者继承product新建一个类如图2那样。
2.如何解决上述问题?可以在创建函数中接受参数如type或者模板化fatory类。
3.Factory模式仅仅局限于一类product,即有一个共同的基类。
4.如何为不同类的类提供创建接口呢?请参见Abstract factory!
回到本例原先的fruit问题,可以用下图进行表示:
代码如下:
fruit* p = Factory::createfruit(1);
p->growup();