#ifndef Animal_hpp
#define Animal_hpp
#define CC_SYNTHESIZE(varType, varName, funName)\
protected: varType varName ;\
public: virtual varType get##funName(void) const { return varName; }\
public: virtual void set##funName(varType var){ varName = var; }
#include <stdio.h>
#include <iostream>
using namespace std;
class Animal {
public:
Animal() {};
~Animal() {};
CC_SYNTHESIZE(string, type, Type);
virtual void say();
};
#endif /* Animal_hpp */
#include "Animal.hpp"
void Animal::say() {
printf("我是动物\n");
}
#ifndef Cat_hpp
#define Cat_hpp
#include <stdio.h>
#include "Animal.hpp"
class Cat: public Animal {
public:
Cat() {};
~Cat() {};
virtual void say();
};
#endif /* Cat_hpp */
#include "Cat.hpp"
void Cat::say() {
printf("Cat say\n");
}
#ifndef Dog_hpp
#define Dog_hpp
#include <stdio.h>
#include "Animal.hpp"
class Dog:public Animal {
public:
Dog() {};
~Dog() {};
virtual void say();
};
#endif /* Dog_hpp */
#include "Dog.hpp"
void Dog::say() {
printf("Dog say\n");
}
#ifndef Creater_hpp
#define Creater_hpp
#include <stdio.h>
#include "Animal.hpp"
class Creater {
public:
Creater() {};
~Creater() {};
Animal* createDog();
Animal* createCat();
CC_SYNTHESIZE(Animal*, dog, Dog);
CC_SYNTHESIZE(Animal*, cat, Cat);
};
#endif /* Creater_hpp */
#include "Creater.hpp"
#include "Cat.hpp"
#include "Dog.hpp"
Animal* Creater::createCat() {
if (!cat) {
cat = new Cat();
}
return cat;
}
Animal* Creater::createDog() {
if (!dog) {
dog = new Dog();
}
return dog;
}
以下就是普通的工厂模式调用
#include <iostream>
#include "Creater.hpp"
#include "Cat.hpp"
#include "Dog.hpp"
#include "Animal.hpp"
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, 工厂!\n";
Creater *creater = new Creater();
creater->createCat()->say();
creater->createDog()->say();
return 0;
}