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ı 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.
Birçok parametre içeren (bu da kafa karıştırıcı hâle gelen) bir oluşturucu yerine Builder, her yapılandırma seçeneği için açık ve adlandırılmış yöntemler 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 setter yöntemi, akıcı bir arayüz için yöntem zincirlemeyi mümkün kılarak oluşturucuya bir başvuru (return *this) döndürür. build() yöntemi işlemi tamamlar ve oluşturulan nesneyi döndürür.
İsteğe bağlı birçok bileşene sahip nesneler oluştururken, okunabilir oluşturma kodu istediğinizde veya aynı oluşturma sürecinin farklı temsiller oluşturması gerektiğinde Builder'ı kullanın.
Görev
KolayAdım adım özel bilgisayar yapılandırmasına olanak tanıyan bir Computer Builder sistemi oluşturalım. Bu, Builder 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ı bir araya getirmek için temiz, okunabilir bir yol isteriz.
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 private üyeler olarak saklamalıdır:cpu(string),ram(string),storage(string),gpu(string) vehasWifi(boolean).hasWifideğerinifalseolarak, dizeleri ise varsayılan olarak boş olacak şekilde başlatın.Bilgisayarın yapılandırmasını görüntüleyen
showSpecs()adlı public bir metot ekleyin. Ayarlanmış olan her bileşeni (boş olmayan dizeyi) 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üzle bilgisayarları oluşturan builder sınıfını oluşturun.ComputerBuildersınıfınızın, oluşturduğu private birComputerüyesi olmalıdır. Her biri metot zincirlemesini etkinleştirmek için 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ış
build()nesnesini döndüren ve olası yeniden kullanım için builder'ı sıfırlayan birComputermetodu uygulayın.main.cpp: Özel bir bilgisayar oluşturmak için her şeyi bir araya getirin.Dört girdi okuyun:
- CPU modeli (string)
- RAM özellikleri (string)
- Depolama özellikleri (string)
- Wifi'ın dahil edilip edilmeyeceği:
yesveyano
Sağlanan CPU, RAM ve depolama bilgileriyle bir bilgisayar oluşturmak için
ComputerBuilderkullanın. Wifi girdisiyesise ayrıcaaddWifi()çağrısı yapın. Bu yapılandırmada GPU belirtilmediğine dikkat edin: builder, isteğe bağlı bileşenleri sorunsuz bir şekilde ele almalıdır.Oluşturma işleminden sonra, yapılandırmasını görüntülemek için ortaya çıkan bilgisayarda
showSpecs()çağrısı yapın.
showSpecs() metodu şu biçimde çıktı vermelidir (yalnızca ayarlanmış bileşenleri göstererek):
CPU: [value]
RAM: [value]
Storage: [value]
GPU: [value]
Wifi: EnabledÖrneğin girdiler Intel i7-12700K, 32GB DDR5, 1TB NVMe SSD ve yes olduğunda:
CPU: Intel i7-12700K
RAM: 32GB DDR5
Storage: 1TB NVMe SSD
Wifi: EnabledGirdiler AMD Ryzen 5 5600X, 16GB DDR4, 512GB SSD ve no olduğunda:
CPU: AMD Ryzen 5 5600X
RAM: 16GB DDR4
Storage: 512GB SSDBuilder kalıbının oluşturma sürecini nasıl okunabilir ve esnek hâle getirdiğine dikkat edin. Bileşenleri kolayca ekleyebilir veya atlayabilirsiniz; metot zincirleme ise açık, kendi kendini açıklayan bir kod oluşturur. GPU satırı, onu hiç ayarlamadığımız için görünmez; bu da builder'ların isteğe bağlı bileşenleri doğal bir şekilde nasıl 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 storage'ı ayarlamak için method chaining kullan
// TODO: wifiChoice "yes" ise, ayrıca addWifi() çağır
// TODO: Computer nesnesini almak için build() çağır
// TODO: Yapılandırmayı görüntülemek için oluşturulan bilgisayarda showSpecs() ç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
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 KonteynerKendi başına pratik yap: Online C++ derleyicisi