在软件设计的时候,我们如果希望一个对象只能由另一个对象生成,比如水果农厂里面可以结出各种各样的水果,而水果不能平白无故的产生。
所以水果对象的构造函数肯定是private,而水果农厂却可以NewFruit(), 其中将水果农厂(CFruitFarm)作为友元,插入到各种水果当中就可以实现这
个效果。下面举例说明:
#include <iostream>
#include <string>
using namespace std;
//class CFruitFactory;
class ICanBeEat
{
public:
virtual void Eat() = 0;
};
class CApple : public ICanBeEat
{
friend class CFruitFactory;
private:
void *pSource;
CApple(void *pSource) { this->pSource = pSource; }
void Eat(){ cout<< "Im eat apple" <<endl; }
};
class COrange : public ICanBeEat
{
friend class CFruitFactory;
private:
void *pSource;
COrange(void *pSource) { this->pSource = pSource; }
void Eat(){ cout<< "Im eat orange" <<endl; }
};
class CFruitFactory
{
private:
void *pSource; //将工厂里的资源传递给生成的对象
public:
enum enumFruit
{
enumAPPLE = 0,
enumORANGE
};
ICanBeEat * NewFruit(enumFruit enumVar)
{
if(enumVar == enumAPPLE)
return new CApple(pSource);
else if(enumVar == enumORANGE)
return new COrange(pSource);
}
};
int main()
{
//COrange obj1(NULL); //error, because constructor is private
//CApple obj2(NULL); //error, because constructor is private
CFruitFactory objFruit;
ICanBeEat *pObj = objFruit.NewFruit(CFruitFactory:: enumAPPLE);
pObj->Eat();
pObj = objFruit.NewFruit(CFruitFactory:: enumORANGE);
pObj->Eat();
}
以上的手法,就可以约束水果只能由水果农厂生成。