algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Budowniczy (builder) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 8
SłabyŚwietny
Nadesłany przez Kamil Dworak, 05 sierpnia 2010 21:17
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

builder_1_c.cpp:
/****************************************
*   Wzorzec Projektowy Builder          *
*   (budowniczy)                        *   
*   www.algorytm.org                    *
*   Opracowal Dworak Kamil              *
*****************************************/

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


class ZestawKomputerowy {
      
private:
         string monitor;
         string procesor;
         string grafika;
         string ram;
         string hdd;
public:
         void setMonitor(string m){
              monitor = m ; 
              }
    
         void setProcesor(string p){
              procesor = p;
              }
    
         void setGrafika(string g){
              grafika = g;
              }
    
         void setRam(string r){
              ram = r;
              }
    
         void setHdd(string h){
              hdd = h;
              }
         
		 void show(){
              if(monitor!="") cout<< "Monitor = " << monitor << endl;
              if(procesor!="") cout << "Procesor = " << procesor << endl;
              if(grafika!="") cout << "Grafika = " << grafika << endl;
              if(ram!="") cout << "RAM = " << ram << endl;
              if(hdd!="") cout << "HDD = " << hdd << endl;
              }
};

/* nasz glowny interdace */
class Builder {
protected:
	ZestawKomputerowy* zestawKomputerowy;

public:
	void newZestaw(){
		zestawKomputerowy = new ZestawKomputerowy();
	}

	ZestawKomputerowy getZestaw(){
		return* zestawKomputerowy;
	}

	virtual void buildMonitor()=0;
    virtual void buildProcesor()=0;
    virtual void buildGrafika()=0;
    virtual void buildRam()=0;
    virtual void buildHdd()=0;
};

class ZestawXT001:public Builder {
public :

	ZestawXT001():Builder(){
	}

	void buildMonitor(){
        zestawKomputerowy->setMonitor("Benq 19");
    }
    
    void buildProcesor(){
        zestawKomputerowy->setProcesor("amd");
    }

    void buildGrafika(){
        zestawKomputerowy->setGrafika("ATI");
	}

    void buildRam(){
        zestawKomputerowy->setRam("DDR3");
	}

	void buildHdd(){
        
        int t;
        while(true){
            cout << "Dysk do wyboru: (1) Samsung, (2) Segate, (3) Caviar"<<endl;
            cin >> t;
            if(t>0 && t<4) break;
        }
        
        string wynik;
        if(t==1) wynik = "Samsung";
        else if(t==2) wynik = "Segate";
        else if(t==3) wynik = "Caviar";
        
        zestawKomputerowy->setHdd(wynik);
    
}
};

class ZestawABC996:public Builder {
public:
    
	ZestawABC996():Builder(){
	}

	void buildMonitor(){
        zestawKomputerowy->setMonitor("LG");
    }
    
    void buildProcesor(){
        zestawKomputerowy->setProcesor("INTEL");
    }

    void buildGrafika(){
        //zestaw nie obejmuje karty graficznej
	}

    void buildRam(){
        zestawKomputerowy->setRam("DDR");
	}

    void buildHdd(){
        zestawKomputerowy->setHdd("Samsung");
	}
};

/* kierownik */
class Director {
private:
	Builder* builder;
    
public:
    void setBuilder(Builder* b){
        builder = b;
    }
    
    ZestawKomputerowy getZestaw(){
        return builder->getZestaw();
    }
    
    void skladaj(){
        builder->newZestaw();
        builder->buildMonitor();
        builder->buildProcesor();
        builder->buildHdd();
        builder->buildRam();
        builder->buildGrafika();
    }
};

int main(){
	Director* szef = new  Director();
	
	
	Builder* builder = new  ZestawXT001();
    Builder* builder2 = new  ZestawABC996();
        
    cout<<"\nZESTAW 1\n";
	szef->setBuilder(builder);
    szef->skladaj();
    ZestawKomputerowy zestaw1 = szef->getZestaw();

	szef->setBuilder(builder2);
    szef->skladaj();
    ZestawKomputerowy zestaw2 = szef->getZestaw();

	zestaw1.show();
    cout << "\n\nZESTAW2\n" ;
    zestaw2.show();

	int x;
	cin >>x;
}
Komentarze
photo
+1 # lryszka 2018-03-24 14:35
Zgodnie z teorią (https://pl.wikipedia.org/wiki/Budowniczy_(wzorzec_projektowy)#/media/File:Builder_cl asses_pl.svg) metoda getZestaw powinna być zaimplementowan a w klasie Builder, a nie w klasie Director. Wówczas to konkretny builder (ZestawXT001, ZestawABC996, ...) zwraca produkt.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # Przemysław1234 2018-08-29 07:18
Brakuje zwolnienia dynamicznie przydzielonej pamięci ;)
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz