Created
March 27, 2022 14:43
-
-
Save bunyamintamar/092461cb21b9dd6fe687644418b2d686 to your computer and use it in GitHub Desktop.
Builder Tasarım Kalıbı - Builder Design Pattern
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* Builder Tasarım Kalıbı Örneği - Builder Design Pattern */ | |
| /* | |
| Birçok özelliğe (değişkene) sahip bir sınıfımız olsun. | |
| Bu sınıftan bir nesne üretmek için birçok setter metodunu kullanmak zorundayız. | |
| Diyelim ki bazı belli başlı kalıplarda nesneler üreteceğiz. | |
| Her seferinde zibilyon tane setter metodunu kullanmak biraz zor değil mi? | |
| İşte burada bizim yerimize nesne inşa eden inşaatçilerimiz var. | |
| Hadi kodlayalım ! | |
| */ | |
| #include <iostream> | |
| #include <string> | |
| #include <memory> | |
| using namespace std; | |
| /**************************************************************************/ | |
| class Araba // Hedef sınıfımız! | |
| { // Birçok özelliğe sahip | |
| private: // Dolayısıyla birçok setter metodu bulunmakta | |
| string marka; | |
| string model; | |
| string kasaTipi; | |
| string renk; | |
| string yakitTipi; | |
| string motorHacmi; | |
| public: // zibilyon tane setter | |
| void setMarka(string marka) { this->marka = marka; } | |
| void setModel(string model) { this->model = model; } | |
| void setKasaTipi(string kasaTipi) { this->kasaTipi = kasaTipi; } | |
| void setRenk(string renk) { this->renk = renk; } | |
| void setYakitTipi(string yakitTipi) { this->yakitTipi = yakitTipi; } | |
| void setMotorHacmi(string motorHacmi) { this->motorHacmi = motorHacmi; } | |
| void ozellikleriListele() | |
| { | |
| string ozellikler; | |
| ozellikler.append("\n------------"); | |
| ozellikler.append("\nmarka : ").append(marka); | |
| ozellikler.append("\nmodel : ").append(model); | |
| ozellikler.append("\nkasaTipi : ").append(kasaTipi); | |
| ozellikler.append("\nrenk : ").append(renk); | |
| ozellikler.append("\nyakitTipi : ").append(yakitTipi); | |
| ozellikler.append("\nmotorHacmi: ").append(motorHacmi); | |
| ozellikler.append("\n------------\n\n"); | |
| cout << ozellikler; | |
| } | |
| }; | |
| /**************************************************************************/ | |
| class KatologBuilder // Soyut sınıf olmalı | |
| { | |
| protected: | |
| unique_ptr<Araba> araba; | |
| public: | |
| void ozellikYarat() { araba = make_unique<Araba>(); } | |
| Araba *getOzellikler() { return araba.release(); } | |
| virtual void setMarka() = 0; | |
| virtual void setModel() = 0; | |
| virtual void setKasaTipi() = 0; | |
| virtual void setRenk() = 0; | |
| virtual void setYakitTipi() = 0; | |
| virtual void setMotorHacmi() = 0; | |
| }; | |
| class MeganeBuilder : public KatologBuilder // İstediğimiz kalıplardan biri | |
| { | |
| public: | |
| void setMarka() { araba->setMarka("Renault"); } | |
| void setModel() { araba->setModel("Megane"); } | |
| void setKasaTipi() { araba->setKasaTipi("Sedan"); } | |
| void setRenk() { araba->setRenk("Gri"); } | |
| void setYakitTipi() { araba->setYakitTipi("Benzin"); } | |
| void setMotorHacmi() { araba->setMotorHacmi("1.6"); } | |
| }; | |
| class ClioBuilder : public KatologBuilder // İstediğimiz kalıplardan biri | |
| { | |
| public: | |
| void setMarka() { araba->setMarka("Renault"); } | |
| void setModel() { araba->setModel("Clio"); } | |
| void setKasaTipi() { araba->setKasaTipi("Hatchback"); } | |
| void setRenk() { araba->setRenk("Siyah"); } | |
| void setYakitTipi() { araba->setYakitTipi("Dizel"); } | |
| void setMotorHacmi() { araba->setMotorHacmi("1.5"); } | |
| }; | |
| /**************************************************************************/ | |
| class Galeri // Bütün bu süreci yönetecek sınıf | |
| { | |
| private: | |
| KatologBuilder *katologBuilder; | |
| public: | |
| void arabayiSec(KatologBuilder *katolog) | |
| { | |
| katologBuilder = katolog; | |
| katologBuilder->ozellikYarat(); | |
| katologBuilder->setMarka(); | |
| katologBuilder->setModel(); | |
| katologBuilder->setKasaTipi(); | |
| katologBuilder->setRenk(); | |
| katologBuilder->setYakitTipi(); | |
| katologBuilder->setMotorHacmi(); | |
| } | |
| Araba *arabayiGetir() | |
| { | |
| return katologBuilder->getOzellikler(); | |
| } | |
| }; | |
| /**************************************************************************/ | |
| int main(int argc, char **argv) | |
| { | |
| Galeri *galeri = new Galeri(); | |
| MeganeBuilder birMegane; // Galeride bu araca ulaşılabilir | |
| ClioBuilder birClio; // Galeride bu araca ulaşılabilir | |
| cout << "Musteri bir Megane istiyor"; | |
| galeri->arabayiSec(&birMegane); | |
| Araba *myCar = galeri->arabayiGetir(); | |
| myCar->ozellikleriListele(); | |
| cout << "Musteri bir Clio istiyor"; | |
| galeri->arabayiSec(&birClio); | |
| Araba *yourCar = galeri->arabayiGetir(); | |
| yourCar->ozellikleriListele(); | |
| // Oluşan nesneyi doğrudan kullanalım bakalım | |
| cout << "Clio'nun rengini değiştirelim"; | |
| yourCar->setRenk("Kırmızı"); | |
| yourCar->ozellikleriListele(); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment