Skip to content

Instantly share code, notes, and snippets.

@bunyamintamar
Created March 27, 2022 14:43
Show Gist options
  • Select an option

  • Save bunyamintamar/092461cb21b9dd6fe687644418b2d686 to your computer and use it in GitHub Desktop.

Select an option

Save bunyamintamar/092461cb21b9dd6fe687644418b2d686 to your computer and use it in GitHub Desktop.
Builder Tasarım Kalıbı - Builder Design Pattern
/* 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