Nadesłany przez Jacek Węgorkiewicz, 15 listopada 2016 02:00
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.
AbstractFactory.cpp:
//============================================================================ // Name : AbstractFactory.cpp // Author : Jacek Węgorkiewicz // Description : Implementacja przykłady fabryki abstrakcyjnej dla portalu // www.algorytm.org //============================================================================ #include <iostream> #include <string> using namespace std; class Dysk { public: virtual Dysk* dawajDysk() = 0; virtual ~Dysk() {} }; class Grafika { public: virtual Grafika* dawajGrafike() = 0; virtual ~Grafika() {}; }; class RAM { public: virtual RAM* dawajRAM() = 0; virtual ~RAM() {}; }; class Procesor { public: virtual Procesor* dawajProcesor() = 0; virtual ~Procesor() {}; }; class Chlodzenie { public: virtual Chlodzenie* dawajChlodzenie() = 0; virtual ~Chlodzenie() {}; }; class FabrykaPodzespolowKomputerowych { public: virtual Dysk* produkujemyDysk() = 0; virtual Grafika* produkujemyGrafike() = 0; virtual RAM* produkujemyRAM() = 0; virtual Procesor* produkujemyProcesor() = 0; virtual Chlodzenie* produkujemyChlodzenie() = 0; virtual ~FabrykaPodzespolowKomputerowych() {} }; class DyskDlaPC: public Dysk { private: string name; public: DyskDlaPC() { name = "DyskDlaPC"; } Dysk* dawajDysk() { cout << "Dodaje " + name << endl; return new DyskDlaPC(); } }; class GrafikaDlaPC: public Grafika { private: string name; public: GrafikaDlaPC() { name = "GrafikaDlaPC"; } Grafika* dawajGrafike() { cout << "Dodaje " + name << endl; return new GrafikaDlaPC(); } }; class DDR3: public RAM { private: string name; public: DDR3() { name = "DDR3"; } RAM* dawajRAM() { cout << "Dodaje " + name << endl; return new DDR3(); } }; class ProcesorDlaPC: public Procesor { private: string name; public: ProcesorDlaPC() { name = "ProcesorDlaPC"; } Procesor* dawajProcesor() { cout << "Dodaje " + name << endl; return new ProcesorDlaPC(); } }; class FabrykaPodzespolowPC: public FabrykaPodzespolowKomputerowych { public: Dysk* produkujemyDysk() { return new DyskDlaPC(); } Grafika* produkujemyGrafike() { return new GrafikaDlaPC(); } RAM* produkujemyRAM() { return new DDR3(); } Procesor* produkujemyProcesor() { return new ProcesorDlaPC(); } Chlodzenie* produkujemyChlodzenie() { return NULL; } }; class DyskDlaLaptopa: public Dysk { private: string name; public: DyskDlaLaptopa() { name = "DyskDlaLaptopa"; } Dysk* dawajDysk() { cout << "Dodaje " + name << endl; return new DyskDlaLaptopa(); } }; class GrafikaDlaLaptopa: public Grafika { private: string name; public: GrafikaDlaLaptopa() { name = "GrafikaDlaLaptopa"; } Grafika* dawajGrafike() { cout << "Dodaje " + name << endl; return new GrafikaDlaLaptopa(); } }; class DDR2: public RAM { private: string name; public: DDR2() { name = "DDR2"; } RAM* dawajRAM() { cout << "Dodaje " + name << endl; return new DDR2(); } }; class ProcesorDlaLaptopa: public Procesor { private: string name; public: ProcesorDlaLaptopa() { name = "ProcesorDlaLaptopa"; } Procesor* dawajProcesor() { cout << "Dodaje " + name << endl; return new ProcesorDlaLaptopa(); } }; class ChlodzenieDlaLaptopa: public Chlodzenie { private: string name; public: ChlodzenieDlaLaptopa() { name = "ChlodzenieDlaLaptopa"; } Chlodzenie* dawajChlodzenie() { cout << "Dodaje " + name << endl; return new ChlodzenieDlaLaptopa(); } }; class FabrykaPodzespolowLaptop: public FabrykaPodzespolowKomputerowych { public: Dysk* produkujemyDysk() { return new DyskDlaLaptopa(); } Grafika* produkujemyGrafike() { return new GrafikaDlaLaptopa(); } RAM* produkujemyRAM() { return new DDR2(); } Procesor* produkujemyProcesor() { return new ProcesorDlaLaptopa(); } Chlodzenie* produkujemyChlodzenie() { return new ChlodzenieDlaLaptopa(); } }; class Komputer { protected: Dysk* dysk; Dysk* dysk_tmp; Grafika* grafika; Grafika* grafika_tmp; RAM* ram; RAM* ram_tmp; Procesor* procesor; Procesor* procesor_tmp; Chlodzenie* chlodzenie; Chlodzenie* chlodzenie_tmp; virtual void skladanie() = 0; public: void instalowanieOprogramowania() { cout << "Instalowanie oprogramowania..." << endl; } void pakowanie() { cout << "Pakowanie..." << endl; } void sprzedawanie() { cout << "Sprzedaje..." << endl; } virtual ~Komputer() { } }; class KomputerPC: public Komputer { private: FabrykaPodzespolowKomputerowych* f; protected: void skladanie() { dysk_tmp = f->produkujemyDysk(); dysk = dysk_tmp->dawajDysk(); grafika_tmp = f->produkujemyGrafike(); grafika = grafika_tmp->dawajGrafike(); procesor_tmp = f->produkujemyProcesor(); procesor = procesor_tmp->dawajProcesor(); ram_tmp = f->produkujemyRAM(); ram = ram_tmp->dawajRAM(); } public: KomputerPC(FabrykaPodzespolowPC* fPC) : f(fPC) { skladanie(); } ~KomputerPC() { delete ram_tmp; delete ram; delete procesor_tmp; delete procesor; delete grafika_tmp; delete grafika; delete dysk_tmp; delete dysk; delete f; } }; class Laptop: public Komputer { private: FabrykaPodzespolowKomputerowych* f; protected: void skladanie() { dysk_tmp = f->produkujemyDysk(); dysk = dysk_tmp->dawajDysk(); grafika_tmp = f->produkujemyGrafike(); grafika = grafika_tmp->dawajGrafike(); procesor_tmp = f->produkujemyProcesor(); procesor = procesor_tmp->dawajProcesor(); ram_tmp = f->produkujemyRAM(); ram = ram_tmp->dawajRAM(); chlodzenie_tmp = f->produkujemyChlodzenie(); chlodzenie = chlodzenie_tmp->dawajChlodzenie(); } public: Laptop(FabrykaPodzespolowLaptop *fLaptop) : f(fLaptop) { skladanie(); } ~Laptop() { delete chlodzenie_tmp; delete chlodzenie; delete ram_tmp; delete ram; delete procesor_tmp; delete procesor; delete grafika_tmp; delete grafika; delete dysk_tmp; delete dysk; delete f; } }; class FabrykaKomputerow { private: Komputer* zlozKomputer(string model) { Komputer* komputer; if("PC" == model) komputer = new KomputerPC(new FabrykaPodzespolowPC()); else komputer = new Laptop(new FabrykaPodzespolowLaptop()); return komputer; } public: Komputer* wydajKomputer(string model) { Komputer* komputer = zlozKomputer(model); komputer->instalowanieOprogramowania(); komputer->pakowanie(); komputer->sprzedawanie(); return komputer; } }; int main() { FabrykaKomputerow* fabrykaKomputerow = new FabrykaKomputerow(); Komputer* pc = fabrykaKomputerow->wydajKomputer("PC"); Komputer* laptop = fabrykaKomputerow->wydajKomputer("Laptop"); delete laptop; delete pc; delete fabrykaKomputerow; return 0; }