Fruit.h #pragma once #include <boost/shared_ptr.hpp> class Fruit { public: virtual ~Fruit(){} virtual void print() = 0; }; Apple.h #pragma once #pragma once #include "Fruit.h" #include <iostream> class Apple : public Fruit { public: virtual void print() { std::cout << "Apple" << std::endl; } }; Banana.h #pragma once #include "Fruit.h" #include <iostream> class Banana : public Fruit { public: virtual void print() { std::cout << "Banana" << std::endl; } }; SampleFactory.h #pragma once #include <string> #include <boost/shared_ptr.hpp> #define SAMPLE_FACTORY_BEGIN(base)/ class base##Factory/ {/ public:/ static boost::shared_ptr<base> create(const std::string& type);/ };/ / boost::shared_ptr<base> base##Factory::create(const std::string& type)/ { #define SAMPLE_FACTORY_REGISTER(base, derive, name)/ if (name == type)/ {/ return boost::shared_ptr<base>(new derive);/ } #define SAMPLE_FACTORY_END(base)/ return boost::shared_ptr<base>(static_cast<base*>(NULL));/ } FruitFactory.h #pragma once #include "Fruit.h" #include "Apple.h" #include "Banana.h" #include "SampleFactory.h" SAMPLE_FACTORY_BEGIN(Fruit) SAMPLE_FACTORY_REGISTER(Fruit, Apple, "Apple") SAMPLE_FACTORY_REGISTER(Fruit, Banana, "Banana") SAMPLE_FACTORY_END(Fruit) main.h #include "FruitFactory.h" #include <boost/shared_ptr.hpp> using namespace boost; int main() { shared_ptr<Fruit> fruit = FruitFactory::create("Apple"); if (fruit.get()) { fruit->print(); } fruit = FruitFactory::create("Banana"); if (fruit.get()) { fruit->print(); } return 0; }