Skip to main content

‘AbstractFactory’ Design Pattern using simple program

· 2 min read

Definition: Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

Program:


#include "iostream"
using namespace std;

// Abstract Factory pattern
class AbstractProductA
{
public:
virtual void Show() = 0;
};

class AbstractProductB
{
public:
virtual void Show() = 0;
};

class AbstractFactory
{
public:
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
};

class ProductA1 : public AbstractProductA
{
public:
virtual void Show()
{
cout<<"ProductA1 Show"<<endl;>
}
};

class ProductB1 : public AbstractProductB
{
public:
virtual void Show()
{
cout<<"ProductB1 Show"<<endl;>
}
};

class ProductA2 : public AbstractProductA
{
public:
virtual void Show()
{
cout<<"ProductA2 Show"<<endl;
}
};

class ProductB2 : public AbstractProductB
{
public:
virtual void Show()
{
cout<<"ProductB2 Show"<<endl;
}
};

class ConcreteFactory1 : public AbstractFactory
{
public:
virtual AbstractProductA* CreateProductA()
{
return new ProductA1();
}

virtual AbstractProductB* CreateProductB()
{
return new ProductB1();
}
};

class ConcreteFactory2 : public AbstractFactory
{
public:
virtual AbstractProductA* CreateProductA()
{
return new ProductA2();
}

virtual AbstractProductB* CreateProductB()
{
return new ProductB2();
}
};

class Client
{
private:
AbstractProductA* _abstractProductA;
AbstractProductB* _abstractProductB;

public:
Client(AbstractFactory\* factory)
{
_abstractProductB = factory->CreateProductB();
_abstractProductA = factory->CreateProductA();
}

void Run()
{
_abstractProductA->Show();
_abstractProductB->Show();

delete _abstractProductA;
delete _abstractProductB;
}
};

void main()
{
// Abstract factory #1
AbstractFactory* factory1 = new ConcreteFactory1();
Client* client1 = new Client(factory1);
client1->Run();

delete factory1;
delete client1;

// Abstract factory #2
AbstractFactory* factory2 = new ConcreteFactory2();
Client* client2 = new Client(factory2);
client2->Run();

delete factory2;
delete client2;

getchar();
}

/*
OUT PUT
-------
\[ProductA1\] Show
\[ProductB1\] Show
\[ProductA2\] Show
\[ProductB2\] Show
\*/