Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Kullanı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.

    Computer sınıfınız şu bileşenleri özel üyeler olarak saklamalıdır: cpu (dize), ram (dize), storage (dize), gpu (dize) ve hasWifi (boole). hasWifi değerini false, 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.

    ComputerBuilder sınıfınız, oluşturduğu özel bir Computer ü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ış Computer nesnesini döndüren ve olası yeniden kullanımlar için builder'ı sıfırlayan bir build() metodu uygulayın.

  • main.cpp: Özel bir bilgisayar oluşturmak için tüm parçaları bir araya getirin.

    Dört girdi okuyun:

    1. CPU modeli (dize)
    2. RAM özellikleri (dize)
    3. Depolama özellikleri (dize)
    4. Wi-Fi eklenip eklenmeyeceği: yes veya no

    Verilen CPU, RAM ve depolama bilgileriyle bir bilgisayar oluşturmak için ComputerBuilder kullanın. Wi-Fi girdisi yes ise addWifi() 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: Enabled

AMD Ryzen 5 5600X, 16GB DDR4, 512GB SSD ve no girdileriyle:

CPU: AMD Ryzen 5 5600X
RAM: 16GB DDR4
Storage: 512GB SSD

Builder 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;
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C++ derleyicisi