Design Patterns Explained C++ Code Examples – Chapter 21: The Singleton Pattern

Example 21-1

TOC

Example 21-2

TOC

Example 21-3

TOC

Example 21-1


Tax

TOP
Tax.h

#pragma once
class Tax
{
public:
Tax(void);
public:
virtual ~Tax(void);
};

Tax.cpp

#include "Tax.h"
Tax::Tax(void)
{
}
Tax::~Tax(void)
{
}

USTax

TOP
USTax.h

#pragma once
#include "Tax.h"
class USTax:public Tax
{
public:
static USTax* Instance();
protected:
USTax(void);
private:
static USTax * myInstance;
};
 

USTax.cpp

#include "USTax.h"
USTax* USTax::myInstance = 0;
USTax* USTax::Instance ()
{
if (myInstance == 0) {
myInstance = new USTax;
}
return myInstance;
}


Example 21-2


Tax

TOP
Tax.h

#pragma once
class Tax
{
public:
static Tax* getInstance();
virtual double calcTax(double qty, double price) = 0;
private:
static Tax * myInstance;
};
 

Tax.cpp

#include "Tax.h"
// Tax* Tax::myInstance = 0;

USTax

TOP
USTax.h

#pragma once
#include "Tax.h"
class USTax:public Tax
{
public:
static USTax* getInstance();
virtual double calcTax(double qty, double price);
protected:
USTax(void);
~USTax(void);
private:
static USTax * myInstance;
};

USTax.cpp

#include "USTax.h"
// USTax* USTax::myInstance = 0;
USTax* USTax::getInstance ()
{
if (myInstance == 0) {
myInstance = new USTax;
}
return myInstance;
}
double USTax::calcTax(double a,double b){
return 0; //Obviously needing a real implementation
}
 

Example 21-3


USTax

TOP
USTax.h

#pragma once
// Code Fragments
// Multithreading/Lock Detail Beyond Scope Here
#include <Thread.h>
#include <Mutex.h>
#include <Guard.h>
class USTax
{
public:
static USTax* Instance();
protected:
USTax(void);
virtual ~USTax(void);
private:
static Mutex lock;
static USTax * myInstance;
};

USTax.cpp


// Simplified - In the real world, much detail
// would be added around the multithreading/Lock mechanics
#include "USTax.h"
USTax* USTax::myInstance = 0;
USTax::USTax(void)
{
}
USTax::~USTax(void)
{
}
USTax* USTax::Instance() {
// 1st test
if (myInstance == 0)
{
// acquire lock (simplified)
Guard guard (lock);
// 2nd test
if (myInstance == 0)
{
myInstance = new USTax;
}
// release guard/lock (via destructor)
}
return myInstance;
}