原文地址:
http://www.cnblogs.com/Kelvinshere/archive/2013/03/06/2947022.html
工厂模式其实不是太深奥,
简单工厂模式就是把实例化的工作封装到一个类中
例如,
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: