Template Pattern
Pizza Header File (Pizza.h)
#ifndef PIZZA_H_
#define PIZZA_H_
#include <string>
class Pizza {
public:
Pizza(std::string description);
virtual ~Pizza();
void Prepare();
protected:
virtual void PrepareDough();
virtual void AddSauce();
virtual void AddToppings() = 0;
virtual void Bake();
private:
std::string m_description;
};
#endif /* PIZZA_H_ */
Pizza File (Pizza.cpp)
#include "Pizza.h"
#include <iostream>
Pizza::Pizza(std::string description) : m_description(description) {} // Constructor
Pizza::~Pizza() {} // Deconstructor
void Pizza::Prepare()
{
std::cout << "Preparing a " << m_description << "...\n";
PrepareDough();
AddSauce();
AddToppings();
Bake();
std::cout << "\n";
}
void Pizza::PrepareDough()
{
std::cout << "preparing dough\n";
}
void Pizza::AddSauce()
{
std::cout << "adding sauce\n";
}
void Pizza::Bake()
{
std::cout << "bake pizza\n";
}
Different Kind of Pizzas
Cheese Pizza Header (CheesePizza.h)
#ifndef CHEESEPIZZA_H_
#define CHEESEPIZZA_H_
#include "Pizza.h"
class CheesePizza : public Pizza {
public:
CheesePizza();
virtual ~CheesePizza();
protected:
virtual void AddToppings();
};
#endif /* CHEESEPIZZA_H_ */
Cheese Pizza Implementation (CheesePizza.cpp)
#include "CheesePizza.h"
#include <iostream>
CheesePizza::CheesePizza()
: Pizza(std::string("Cheese Pizza")) {
}
CheesePizza::~CheesePizza() {
}
void CheesePizza::AddToppings()
{
std::cout << "adding cheese topping\n";
}
MeatLovers Pizza Header (MeatLoversPizza.h)
#ifndef MEATLOVERSPIZZA_H_
#define MEATLOVERSPIZZA_H_
#include "Pizza.h"
class MeatLoversPizza : public Pizza {
public:
MeatLoversPizza();
virtual ~MeatLoversPizza();
protected:
virtual void AddToppings();
};
#endif /* MEATLOVERSPIZZA_H_ */
MeatLovers Pizza Implementation (MeatLoversPizza.cpp)
#include "MeatLoversPizza.h"
#include <iostream>
MeatLoversPizza::MeatLoversPizza()
: Pizza(std::string("Meat Lover's Pizza")){
}
MeatLoversPizza::~MeatLoversPizza() {
}
void MeatLoversPizza::AddToppings()
{
std::cout << "adding cheese, pepperoni, sausage and bacon toppings\n";
}
Mushroom Pizza Header (MushroomsPizza.h)
#ifndef MushroomsPizza_H_
#define MushroomsPizza_H_
#include "Pizza.h"
class MushroomsPizza : public Pizza {
protected:
virtual void AddToppings();
public:
MushroomsPizza();
virtual ~MushroomsPizza();
};
#endif /* MushroomsPizza_H */
Mushroom Pizza Implementation (MushroomsPizza.cpp)
#include "MushroomsPizza.h"
#include <iostream>
MushroomsPizza::MushroomsPizza()
: Pizza(std::string("Mushrooms Pizza")) {
}
MushroomsPizza::~MushroomsPizza() {
}
void MushroomsPizza::AddToppings()
{
std::cout << "adding Mushrooms topping\n";
}
Veggie Pizza Header (VeggiePizza.h)
#ifndef VEGGIEPIZZA_H_
#define VEGGIEPIZZA_H_
#include "Pizza.h"
class VeggiePizza : public Pizza {
public:
VeggiePizza();
virtual ~VeggiePizza();
protected:
virtual void AddToppings();
};
#endif
Veggie Pizza Implementation (VeggiePizza.cpp)
#ifndef VEGGIEPIZZA_H_
#define VEGGIEPIZZA_H_
#include "Pizza.h"
class VeggiePizza : public Pizza {
public:
VeggiePizza();
virtual ~VeggiePizza();
protected:
virtual void AddToppings();
};
#endif
Main File
Pizza Main (main.cpp)
#include "CheesePizza.h"
#include "MeatLoversPizza.h"
#include "VeggiePizza.h"
#include "MushroomsPizza.h"
int main()
{
CheesePizza cheesePizza;
cheesePizza.Prepare();
MeatLoversPizza meatLoversPizza;
meatLoversPizza.Prepare();
MushroomsPizza shroomsPizza;
shroomsPizza.Prepare();
VeggiePizza veggiePizza;
veggiePizza.Prepare();
return 0;
}
Output:
Preparing a Cheese Pizza...
preparing dough
adding sauce
adding cheese topping
bake pizza
Preparing a Meat Lover's Pizza...
preparing dough
adding sauce
adding cheese, pepperoni, sausage and bacon toppings
bake pizza
Preparing a Mushrooms Pizza...
preparing dough
adding sauce
adding Mushrooms topping
bake pizza
Preparing a Veggie Pizza...
preparing dough
adding sauce
adding veggie topping
bake pizza