抽象工厂模式 C++

工厂模式其实不是太深奥,

简单工厂模式就是把实例化的工作封装到一个类中

例如,

Class Product{

};

Class Factory{

public:

Product *pruduce(){

  return new Produce();

}

};

int main(){

Factory factory;

Product *product = factory.produce();

return 0;  

}

 

工厂方法和简单工厂的不同在于,用抽象吧produce函数封装起来,根据子类来调用各自不同的produce函数,生产不同的产品。

工厂方法是抽象工厂的特例,工厂方法中生产一个产品,而抽象工厂生产一系列相关的产品。

 

下面是一个例子,Monkey想要吃香蕉和苹果,香蕉苹果有中国产的,还有印度产的。Monkey跟住需求去找来自中国或者印度的农民,然后农民就会收获他们国家的香蕉和苹果给猴子。Kind of silly.

抽象工厂的代码:

 

//抽象工厂
#include <iostream>
using namespace std;

//////////////////////
class Apple{
public:
	virtual	void AppleSayHi() = 0;
};
class ChinaApple:public Apple{
public:
	void AppleSayHi(){
			cout<<"Hi~ I'm an Apple from China.\n";
	}
};
class IndiaApple:public Apple{
public:
	void AppleSayHi(){
			cout<<"Hi~ I'm an Apple from India.\n";
	}
};


class Banana{
	public:
	virtual	void BananaSayHi() = 0;
};
class ChinaBanana:public Banana{
	public:		
		void BananaSayHi(){
			cout<<"Hi~ I'm a Banana from China.\n";
		}
};
class IndiaBanana:public Banana{
	public:		
		void BananaSayHi(){
			cout<<"Hi~ I'm a Banana from India.\n";
		}
};

//////////////////////

class Farmer{
public:
	virtual Apple* harvestApple() = 0;	
	virtual Banana* harvestBanana() = 0;
};
class ChinaFarmer:public Farmer{
public:
	Apple* harvestApple(){ return  new ChinaApple();}
	Banana* harvestBanana(){return new ChinaBanana();}
};
class IndiaFarmer:public Farmer{
public:
	Apple* harvestApple(){return new IndiaApple();}
	Banana* harvestBanana(){return new IndiaBanana();}
};

//////////////////////

class Monkey{//又要买苹果又要买香蕉的客户
public:
	Apple *apple;
	Banana *banana;
	void SayHi(){
		cout<<"Some fruits in my stomach:\n";
		apple->AppleSayHi();
		banana->BananaSayHi();
	}
	Monkey(string Country){
		Farmer *farmer;
		if (0 == Country.compare("China"))
		{	
			farmer = new ChinaFarmer();
		}
		else if (0 == Country.compare("India"))
		{
			farmer = new IndiaFarmer();
		}		
		apple = farmer->harvestApple();
		banana = farmer->harvestBanana();
	}
	

};
int main(){
	//测试
	Monkey monkey1("China");
	monkey1.SayHi();
	
	Monkey monkey2("India");
	monkey2.SayHi();

	getchar();
	return 0;
}

 Result:

 

 

 

 

 

posted @ 2013-03-06 21:56  KelvinDesus  阅读(642)  评论(0编辑  收藏  举报