Template Pattern

inserting an Image inserting an Image

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

inserting an Image inserting an Image inserting an Image