Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

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

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

    ComputerBuilder sınıfınızın, oluşturduğu private bir Computer ü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 bir Computer metodu uygulayın.

  • main.cpp: Özel bir bilgisayar oluşturmak için her şeyi bir araya getirin.

    Dört girdi okuyun:

    1. CPU modeli (string)
    2. RAM özellikleri (string)
    3. Depolama özellikleri (string)
    4. Wifi'ın dahil edilip edilmeyeceği: yes veya no

    Sağlanan CPU, RAM ve depolama bilgileriyle bir bilgisayar oluşturmak için ComputerBuilder kullanın. Wifi girdisi yes ise ayrıca addWifi() ç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: Enabled

Girdiler AMD Ryzen 5 5600X, 16GB DDR4, 512GB SSD ve no olduğunda:

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

Builder 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;
}
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