Builder Kalıbı
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 93 / 104.
Builder deseni, karmaşık bir nesnenin oluşturulmasını temsilinden ayırarak farklı konfigürasyonları adım adım oluşturmanıza olanak tanır. Bu, özellikle bir nesnenin çok sayıda isteğe bağlı parametresi olduğunda veya belirli bir oluşturma sırası gerektirdiğinde kullanışlıdır.
Çok sayıda parametreye sahip bir yapıcı (constructor) yerine (ki bu kafa karıştırıcı hale gelir), Builder her bir yapılandırma seçeneği için net, isimlendirilmiş metotlar sağlar:
#include <iostream>
#include <string>
class Pizza {
public:
std::string dough;
std::string sauce;
std::string topping;
bool cheese;
void describe() const {
std::cout << dough << " dough, " << sauce << " sauce, "
<< topping << (cheese ? ", with cheese" : "") << "\n";
}
};
class PizzaBuilder {
private:
Pizza pizza;
public:
PizzaBuilder& setDough(const std::string& d) {
pizza.dough = d;
return *this;
}
PizzaBuilder& setSauce(const std::string& s) {
pizza.sauce = s;
return *this;
}
PizzaBuilder& setTopping(const std::string& t) {
pizza.topping = t;
return *this;
}
PizzaBuilder& addCheese() {
pizza.cheese = true;
return *this;
}
Pizza build() { return pizza; }
};
int main() {
Pizza margherita = PizzaBuilder()
.setDough("thin")
.setSauce("tomato")
.setTopping("basil")
.addCheese()
.build();
margherita.describe();
}Her bir ayarlayıcı (setter) metodu, oluşturucuya (builder) bir referans döndürür (return *this); bu da akıcı bir arayüz (fluent interface) için metot zincirlemeyi (method chaining) mümkün kılar. build() metodu, oluşturulan nesneyi sonlandırır ve döndürür.
Birçok isteğe bağlı bileşene sahip nesneler oluştururken, okunabilir oluşturma kodu istediğinizde veya aynı oluşturma süreci farklı temsiller oluşturması gerektiğinde Builder kullanın.
Görev
KolayKullanıcıların özel bilgisayarları adım adım yapılandırmasına olanak tanıyan bir Computer Builder (Bilgisayar Oluşturucu) sistemi kuralım. Bu, Builder deseni için mükemmel bir senaryodur; bilgisayarların birçok isteğe bağlı bileşeni vardır ve biz farklı yapılandırmaları birleştirmek için temiz, okunabilir bir yol istiyoruz.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Computer.h: Tam olarak yapılandırılmış bir bilgisayarı temsil eden ürün sınıfını tanımlayın.Computersınıfınız şu bileşenleri özel (private) üyeler olarak saklamalıdır:cpu(string),ram(string),storage(string),gpu(string) vehasWifi(boolean).hasWifideğerini varsayılan olarakfalse, string değerlerini ise boş olarak başlatın.Bilgisayarın yapılandırmasını görüntüleyen
showSpecs()adında genel (public) bir metot ekleyin. Ayarlanmış olan (boş olmayan string) her bileşen için, onu kendi satırında yazdırın. Wifi özelliği yalnızca etkinleştirilmişse yazdırılmalıdır.ComputerBuilder.h: Akıcı bir arayüz (fluent interface) ile bilgisayarlar inşa eden builder sınıfını oluşturun.ComputerBuildersınıfınızın, inşa ettiği özel birComputerüyesi olmalıdır. Metot zincirlemeyi (method chaining) etkinleştirmek için her biri builder'a bir referans döndüren şu metotları uygulayın:setCPU(const std::string& cpu)setRAM(const std::string& ram)setStorage(const std::string& storage)setGPU(const std::string& gpu)addWifi()— wifi özelliğini etkinleştirir
Ayrıca, tamamlanmış
Computernesnesini döndüren ve builder'ı potansiyel yeniden kullanım için sıfırlayan birbuild()metodu uygulayın.main.cpp: Özel bir bilgisayar oluşturmak için her şeyi bir araya getirin.Dört girdi okuyun:
- CPU modeli (string)
- RAM özelliği (string)
- Depolama özelliği (string)
- Wifi dahil edilip edilmeyeceği:
yesveyano
Sağlanan CPU, RAM ve depolama ile bir bilgisayar oluşturmak için
ComputerBuildersınıfını kullanın. Eğer wifi girdisiyesise,addWifi()metodunu da çağırın. Bu yapılandırmada hiçbir GPU belirtilmediğine dikkat edin; builder isteğe bağlı bileşenleri sorunsuz bir şekilde yönetmelidir.İnşa ettikten sonra, yapılandırmasını görüntülemek için sonuçta oluşan bilgisayar üzerinde
showSpecs()metodunu çağırın.
showSpecs() metodu şu formatta çıktı vermelidir (yalnızca ayarlanmış bileşenleri göstererek):
CPU: [value]
RAM: [value]
Storage: [value]
GPU: [value]
Wifi: EnabledÖrneğin, Intel i7-12700K, 32GB DDR5, 1TB NVMe SSD ve yes girdileriyle:
CPU: Intel i7-12700K
RAM: 32GB DDR5
Storage: 1TB NVMe SSD
Wifi: EnabledAMD Ryzen 5 5600X, 16GB DDR4, 512GB SSD ve no girdileriyle:
CPU: AMD Ryzen 5 5600X
RAM: 16GB DDR4
Storage: 512GB SSDBuilder deseninin inşa sürecini nasıl okunabilir ve esnek hale getirdiğine dikkat edin; bileşenleri kolayca ekleyebilir veya atlayabilirsiniz ve metot zincirleme net, kendi kendini belgeleyen bir kod oluşturur. GPU satırı görünmez çünkü onu hiç ayarlamadık, bu da builder'ların isteğe bağlı bileşenleri doğal bir şekilde nasıl yönettiğini gösterir.
Kopya kağıdı
Builder deseni, karmaşık bir nesnenin oluşturulmasını temsilinden ayırarak adım adım yapılandırmaya olanak tanır. Bir nesnenin çok sayıda isteğe bağlı parametresi olduğunda veya belirli bir oluşturma sırası gerektirdiğinde kullanışlıdır.
Çok sayıda parametreye sahip yapıcılar (constructors) yerine Builder, her yapılandırma seçeneği için açık, adlandırılmış yöntemler sunar:
class Pizza {
public:
std::string dough;
std::string sauce;
std::string topping;
bool cheese;
};
class PizzaBuilder {
private:
Pizza pizza;
public:
PizzaBuilder& setDough(const std::string& d) {
pizza.dough = d;
return *this; // Metot zincirlemeyi (method chaining) etkinleştir
}
PizzaBuilder& setSauce(const std::string& s) {
pizza.sauce = s;
return *this;
}
PizzaBuilder& setTopping(const std::string& t) {
pizza.topping = t;
return *this;
}
PizzaBuilder& addCheese() {
pizza.cheese = true;
return *this;
}
Pizza build() { return pizza; }
};
// Metot zincirleme ile kullanım
Pizza margherita = PizzaBuilder()
.setDough("thin")
.setSauce("tomato")
.setTopping("basil")
.addCheese()
.build();Her ayarlayıcı (setter) metot, akıcı bir arayüz (fluent interface) için metot zincirlemeyi etkinleştirmek amacıyla return *this döndürür. build() metodu, oluşturulan nesneyi sonlandırır ve döndürür.
Çok sayıda isteğe bağlı bileşene sahip nesneler oluştururken, okunabilir oluşturma kodları istediğinizde veya aynı oluşturma sürecinin farklı temsiller oluşturması gerektiğinde Builder kullanın.
Kendin dene
#include <iostream>
#include <string>
#include "ComputerBuilder.h"
using namespace std;
int main() {
// Girdileri oku
string cpu, ram, storage, wifiChoice;
getline(cin, cpu);
getline(cin, ram);
getline(cin, storage);
getline(cin, wifiChoice);
// TODO: Bir ComputerBuilder örneği oluşturun
// TODO: CPU, RAM ve storage ayarlamak için method chaining kullanın
// TODO: Eğer wifiChoice "yes" ise, addWifi() fonksiyonunu da çağırın
// TODO: Computer nesnesini elde etmek için build() fonksiyonunu çağırın
// TODO: Yapılandırmayı görüntülemek için oluşturulan bilgisayar üzerinde showSpecs() fonksiyonunu çağırın
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner