#include <iostream>
using namespace std;
class Man {
public:
virtual void introduce() = 0;
};
class WhiteMan : public Man {
public:
virtual void introduce() {
cout << "我是白种男人!" << endl;
}
};
class YellowMan : public Man {
public:
virtual void introduce() {
cout << "我是黄种男人!" << endl;
}
};
class BlackMan : public Man {
public:
virtual void introduce() {
cout << "我是黑种男人!" << endl;
}
};
class Woman {
public:
virtual void introduce() = 0;
};
class WhiteWoman : public Woman {
public:
virtual void introduce() {
cout << "我是白种女人!" << endl;
}
};
class YellowWoman : public Woman {
public:
virtual void introduce() {
cout << "我是黄种女人!" << endl;
}
};
class BlackWoman : public Woman {
public:
virtual void introduce() {
cout << "我是黑种女人!" << endl;
}
};
class AbstractFactory {
public:
virtual Man* ProduceMan() = 0;
virtual Woman* ProduceWoman() = 0;
};
class YellowFactory : public AbstractFactory {
public:
virtual Man* ProduceMan() {
return new YellowMan;
}
virtual Woman* ProduceWoman() {
return new YellowWoman;
}
};
class WhiteFactory : public AbstractFactory {
public:
virtual Man* ProduceMan() {
return new WhiteMan;
}
virtual Woman* ProduceWoman() {
return new WhiteWoman;
}
};
class BlackFactory : public AbstractFactory {
public:
virtual Man* ProduceMan() {
return new BlackMan;
}
virtual Woman* ProduceWoman() {
return new BlackWoman;
}
};
int main(void) {
AbstractFactory * factory = NULL;
Man *man = NULL;
Woman *woman = NULL;
// 黄人
factory = new YellowFactory;
man = factory->ProduceMan();
woman = factory->ProduceWoman();
man->introduce();
woman->introduce();
delete woman;
delete man;
delete factory;
cout << "-----------------------" << endl;
// 白人
factory = new WhiteFactory;
man = factory->ProduceMan();
woman = factory->ProduceWoman();
man->introduce();
woman->introduce();
delete woman;
delete man;
delete factory;
cout << "-----------------------" << endl;
// 黑人
factory = new BlackFactory;
man = factory->ProduceMan();
woman = factory->ProduceWoman();
man->introduce();
woman->introduce();
delete woman;
delete man;
delete factory;
}