Builder Deseni
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 93 / 104.
Builder kalıbı, karmaşık bir nesnenin oluşturulmasını temsilinden ayırır ve farklı yapılandırmaları adım adım oluşturmanı sağlar. 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 parametre içeren bir kurucu (kafa karıştırıcı hâle gelir) yerine Builder, her yapılandırma seçeneği için açık ve adlandırılmış yöntemler sunar:
#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 ayarlayıcı metot, oluşturucuya bir başvuru döndürür (return *this) ve böylece akıcı bir arayüz için metot zincirlemeyi mümkün kılar. build() metodu oluşturulan nesneyi son hâline getirip döndürür.
Çok sayıda isteğe bağlı bileşeni olan nesneler oluştururken, okunabilir oluşturma kodu istediğinde veya aynı oluşturma sürecinin farklı temsiller oluşturması gerektiğinde Builder'ı kullan.
Görev
KolayKullanıcıların özel bilgisayarları adım adım yapılandırmasına olanak tanıyan bir Computer Builder sistemi oluşturalım. Bu, Builder tasarım kalıbı için mükemmel bir senaryodur: bilgisayarların birçok isteğe bağlı bileşeni vardır ve farklı yapılandırmaları oluşturmak için temiz, okunabilir bir yöntem istiyoruz.
Kodunuzu üç dosyaya ayıracaksınız:
Computer.h: Tamamen 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 üyeler olarak saklamalıdır:cpu(dize),ram(dize),storage(dize),gpu(dize) vehasWifi(boole).hasWifideğerinifalse, dizeleri ise varsayılan olarak boş başlatın.Bilgisayarın yapılandırmasını görüntüleyen,
showSpecs()adlı bir genel metot ekleyin. Ayarlanmış (boş olmayan dize) her bileşeni kendi satırına yazdırın. Wi-Fi özelliği yalnızca etkinse yazdırılmalıdır.ComputerBuilder.h: Bilgisayarları akıcı bir arayüzle oluşturan builder sınıfını oluşturun.ComputerBuildersınıfınız, oluşturduğu özel birComputerüyesine sahip olmalıdır. Metot zincirlemesini mümkün kılmak için her biri builder'a bir başvuru 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(): Wi-Fi özelliğini etkinleştirir
Ayrıca, tamamlanmış
Computernesnesini döndüren ve olası yeniden kullanımlar için builder'ı sıfırlayan birbuild()metodu uygulayın.main.cpp: Özel bir bilgisayar oluşturmak için tüm parçaları bir araya getirin.Dört girdi okuyun:
- CPU modeli (dize)
- RAM özellikleri (dize)
- Depolama özellikleri (dize)
- Wi-Fi eklenip eklenmeyeceği:
yesveyano
Verilen CPU, RAM ve depolama bilgileriyle bir bilgisayar oluşturmak için
ComputerBuilderkullanın. Wi-Fi girdisiyesiseaddWifi()metodunu da çağırın. Bu yapılandırmada GPU belirtilmediğine dikkat edin: builder, isteğe bağlı bileşenleri sorunsuz şekilde ele almalıdır.Oluşturma işleminden sonra yapılandırmasını görüntülemek için sonuçta elde edilen bilgisayarda
showSpecs()metodunu çağırın.
showSpecs() metodu şu biçimde çıktı vermelidir (yalnızca ayarlanmış bileşenler gösterilir):
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 tasarım kalıbının oluşturma sürecini ne kadar okunabilir ve esnek hâle getirdiğine dikkat edin. Bileşenleri kolayca ekleyebilir veya atlayabilirsiniz; metot zincirlemesi de anlaşılır ve kendi kendini açıklayan bir kod oluşturur. GPU satırı görünmez çünkü GPU'yu hiç ayarlamadık. Bu da builder'ların isteğe bağlı bileşenleri doğal bir şekilde ele aldığını gösterir.
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ştur
// TODO: CPU, RAM ve depolamayı ayarlamak için metot zincirleme kullan
// TODO: wifiChoice "yes" ise addWifi() metodunu da çağır
// TODO: Computer nesnesini elde etmek için build() metodunu çağır
// TODO: Yapılandırmayı görüntülemek için oluşturulan bilgisayarda showSpecs() metodunu çağır
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
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarC++ Derleme ve Derleme SüreciHeader Dosyaları ve Kaynak DosyalarıNamespace'ler ve KapsamC++'ta Nesne Yönelimli Programlamaya GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriTekrar - Basit Hesap Makinesi4Sınıf Özellikleri
Nesne ve Statik ÜyelerGetter ve Setter'larconst Üye Fonksiyonlarımutable Anahtar SözcüğüStatik 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 DüzeyleriCtor ve Dtor Çağrı SırasıMetot Geçersiz KılmaVirtual Fonksiyonlar ve VTableÇoklu KalıtımVirtual KalıtımÖzet - Çalışan Hiyerarşisi10STL'ye Genel Bakış
STL'ye Genel Bakış ve FelsefesiSTL KapsayıcılarıYineleyicilerSTL AlgoritmalarıFonktörler ve Lambda İfadeleriÖzet - Sözcük Sıklığı13Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory ve Abstract FactoryBuilder DeseniObserver DeseniStrategy Deseni2Bellek Yönetimi
Stack ve Heap Belleğiİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++’ta Akıllı İşaretçilerC++’ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'ta Erişim BelirleyicileriErişim Belirleyicilerine Derinlemesine BakışBilgi GizlemeStruct ve Class Karşılaştırmasıİç İçe ve İç SınıflarTekrar - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme Zamanı 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ıDinamik Tür Dönüştürme ve RTTITekrar - Şekil Hesaplayıcı11İleri Düzey OOP Kavramları
Bileşim ve KalıtımCRTP ile Mixin'lerPimpl İdiomuTür SilmeEnum Sınıfları ve Güçlü TürlemeOOP'de İstisna YönetimiÖzel İstisna Hiyerarşileri14Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpBir Kalıp Olarak RAII3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopyalama YapıcısıTaşıma YapıcısıYapıcı Başlatma ListeleriYönlendiren YapıcılarYıkıcıları Derinlemesine İncelemeÜç / 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örleri Aşırı YüklemeKarşılaştırma Operatörlerini Aşırı YüklemeAkış OperatörleriAtama Operatörünü Aşırı Yükleme[] ve () Operatörlerini Aşırı YüklemeTür Dönüşüm OperatörleriTekrar - Matrix Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeDeğişken Sayıda Argüman Alan ŞablonlarSFINAE ve Tür Özelliklerinin TemelleriTekrar: Genel Amaçlı KapsayıcıKendi başına pratik yap: Online C++ derleyicisi