// Pizza factory example from
// http://en.wikipedia.org/wiki/Factory_method_pattern

#include <string>
#include <iostream>
#include <memory> // std::auto_ptr
class Pizza {
public:
    virtual void get_price() const = 0;
    virtual ~Pizza() {};
};
 
class HamAndMushroomPizza: public Pizza {
public:
    virtual void get_price() const {
        std::cout << "Ham and Mushroom: $8.5" << std::endl;
    }
};
 
class DeluxePizza : public Pizza {
public:
    virtual void get_price() const {
        std::cout << "Deluxe: $10.5" << std::endl;
    }
};
 
class HawaiianPizza : public Pizza {
public:
    virtual void get_price() const {
        std::cout << "Hawaiian: $11.5" << std::endl;
    }
};
 
class PizzaFactory {
public:
    static Pizza* create_pizza(const std::string& type) {
        if (type == "Ham and Mushroom")
            return new HamAndMushroomPizza();
        else if (type == "Hawaiian")
            return new HawaiianPizza();
        else
            return new DeluxePizza();
    }
};

//usage
int main() {
    PizzaFactory factory;
 
    std::auto_ptr<const Pizza> pizza(factory.create_pizza("Default"));
    pizza->get_price();
 
    pizza.reset(factory.create_pizza("Ham and Mushroom"));
    pizza->get_price();
 
    pizza.reset(factory.create_pizza("Hawaiian"));
    pizza->get_price();
}

/*Output:
Deluxe: $10.5
Ham and Mushroom: $8.5
Hawaiian: $11.5
*/