Builder Design Pattern using C++

Builder pattern is a creational design pattern, which can be used in a situation where creating a complex objects involves a lot of steps.According to GO4 it’s intent is to
Separate the construction of a complex object from its representation so that the same construction process can create different representations.following diagram shows UML notation

A builder pattern involves following objects
1) Director
This object is responsible for target object creation using builder object
2) builder
This object is responsible for target object creation .
3) Product
This is the target object.

Example.

Lets take an example of a Desktop computer.class diagram is as shown below.

Sample Code

#include <string>
#include <iostream>
using namespace std;

class CDeskTop
{

public:
    void SetRAM(const string& sRAM)                 { m_sRAM = sRAM;                 }
    void SetProcessor(const string& sProcessor)     { m_sProcessor = sProcessor;     }
    void SetMotherBoard(const string& sMotherBoard) { m_sMotherBoard = sMotherBoard; }
    void SetMonitor(const string& sMonitor)         { m_sMonitor = sMonitor;         }
    void SetKeyboard(const string& sKeyboard)       { m_sKeyboard = sKeyboard;       }
    void SetMouse(const string& sMouse)             { m_sMouse = sMouse;             }
    void SetSpeaker(const string& sSpeaker)         { m_sSpeaker = sSpeaker;         }
    
    void Start() {
        cout<<"Starting the Computer With the Config:\n";
        cout<<"RAM:"<<m_sRAM<<"\n";
        cout<<"Processor:"<<m_sProcessor<<"\n";
        cout<<"MotherBoard:"<<m_sMotherBoard<<"\n";
        cout<<"Monitor:"<<m_sMonitor<<"\n";
        cout<<"Keyboard:"<<m_sKeyboard<<"\n";
        cout<<"Mouse:"<<m_sMouse<<"\n";
        cout<<"Speaker:"<<m_sSpeaker<<"\n";
    }

private:
    string m_sMonitor;
    string m_sKeyboard;
    string m_sMouse;
    string m_sSpeaker;
    string m_sRAM;
    string m_sProcessor;
    string m_sMotherBoard;
};

class IDeskTopBuilder
{
public:
    virtual ~ IDeskTopBuilder() {}
    CDeskTop* GetDeskTop() { return m_pDeskTop; }
    void CreateNewDeskTop()  { m_pDeskTop = new CDeskTop(); }
    virtual void BuidMonitor()      = 0;
    virtual void BuildKeyBoard()    = 0;
    virtual void BuidMouse()        = 0;
    virtual void BuildRAM()         = 0;
    virtual void BuidProcessor()    = 0;
    virtual void BuidSpeaker()      = 0;
    virtual void BuildMotherBoard() = 0;
private:
    string m_sRAM;
    string m_sProcessor;
    string m_sMotherBoard;
    string m_sMonitor;
    string m_sKeyboard;
    string m_sMouse;
    string m_sSpeaker;
protected:
    CDeskTop* m_pDeskTop;
};

class DellDeskTopBuilder : public IDeskTopBuilder
{
public:
    void BuidMonitor()      { m_pDeskTop->SetMonitor("Dell Monitor"); }
    void BuildKeyBoard()    { m_pDeskTop->SetKeyboard("Dell Keyboard"); }
    void BuidMouse()        { m_pDeskTop->SetMouse("Dell Mouse");}
    void BuildRAM()         { m_pDeskTop->SetRAM("Hynet DDR3 ");}
    void BuidProcessor()    { m_pDeskTop->SetProcessor("Intel I6");}
    void BuidSpeaker()      { m_pDeskTop->SetSpeaker("Dell Speaker");}
    void BuildMotherBoard() { m_pDeskTop->SetMotherBoard("Gigabyte");}
};

class AcerDeskTopBuilder : public IDeskTopBuilder
{
public:
    void BuidMonitor()      { m_pDeskTop->SetMonitor("Acer Monitor"); }
    void BuildKeyBoard()    { m_pDeskTop->SetKeyboard("Acer Keyboard"); }
    void BuidMouse()        { m_pDeskTop->SetMouse("Acer Mouse");}
    void BuildRAM()         { m_pDeskTop->SetRAM("Hynet DDR3 ");}
    void BuidProcessor()    { m_pDeskTop->SetProcessor("Intel I6");}
    void BuidSpeaker()      { m_pDeskTop->SetSpeaker("Acer Speaker");}
    void BuildMotherBoard() { m_pDeskTop->SetMotherBoard("Gigabyte");}
};

class ComputerShopDirector
{
public:
 void SetDeskTopBuilder(IDeskTopBuilder* pBuilder) { m_pBuilder = pBuilder;           }
 CDeskTop* GetDeskTop()                            { return m_pBuilder->GetDeskTop(); }

 void BuildDesktop(){
     m_pBuilder->CreateNewDeskTop();
     m_pBuilder->BuidMonitor();
     m_pBuilder->BuidMouse();
     m_pBuilder->BuildRAM();
     m_pBuilder->BuidProcessor();
     m_pBuilder->BuildKeyBoard();
     m_pBuilder->BuidSpeaker();
     m_pBuilder->BuildMotherBoard();
 }

private:
    IDeskTopBuilder* m_pBuilder;
};

//client
void BuilderPatterClient()
{
    ComputerShopDirector director;
    IDeskTopBuilder* pBuilder = new AcerDeskTopBuilder();
    director.SetDeskTopBuilder(pBuilder);
    director.BuildDesktop();
    CDeskTop* pDeskTop = director.GetDeskTop();
    pDeskTop->Start();
}

Leave a comment