Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نمط Builder

جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 93 من 104.

يفصل نمط Builder بين إنشاء كائن معقد وتمثيله، مما يتيح لك إنشاء تكوينات مختلفة خطوة بخطوة. ويكون هذا مفيدًا بشكل خاص عندما يحتوي الكائن على العديد من المعلمات الاختيارية أو يتطلب تسلسل إنشاء محددًا.

بدلاً من مُنشئ يحتوي على العديد من المعلمات (مما يجعله مربكًا)، يوفّر Builder أساليب واضحة ومُسمّاة لكل خيار من خيارات التكوين:

#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();
}

تعيد كل طريقة setter مرجعًا إلى builder (return *this)، مما يتيح chaining للطرق من أجل واجهة سلسة. تُنهي طريقة build() العملية وتعيد الكائن المُنشأ.

استخدم Builder عند إنشاء كائنات تحتوي على العديد من المكوّنات الاختيارية، أو عندما تريد كود إنشاء مقروءًا، أو عندما يجب أن تنشئ عملية الإنشاء نفسها تمثيلات مختلفة.

challenge icon

التحدي

سهل

لنُنشئ نظام Computer Builder يتيح للمستخدمين تهيئة أجهزة كمبيوتر مخصصة خطوةً بخطوة. هذا سيناريو مثالي لنمط Builder: تحتوي أجهزة الكمبيوتر على العديد من المكونات الاختيارية، ونريد طريقة نظيفة وسهلة القراءة لتجميع تهيئات مختلفة.

ستنظّم كودك عبر ثلاثة ملفات:

  • Computer.h: عرّف فئة المنتج التي تمثّل جهاز كمبيوتر مهيأً بالكامل.

    يجب أن تخزّن فئة Computer هذه المكونات كأعضاء خاصة: cpu (سلسلة نصية)، ram (سلسلة نصية)، storage (سلسلة نصية)، gpu (سلسلة نصية)، وhasWifi (قيمة منطقية). هيّئ hasWifi إلى false والسلاسل النصية إلى قيم فارغة افتراضيًا.

    أضف طريقة عامة تُسمّى showSpecs() وتعرض تهيئة جهاز الكمبيوتر. لكل مكوّن تم تعيينه (أي لكل سلسلة نصية غير فارغة)، اطبعه في سطر مستقل. يجب طباعة إمكانية الاتصال بشبكة wifi فقط إذا كانت مفعّلة.

  • ComputerBuilder.h: أنشئ فئة builder التي تبني أجهزة الكمبيوتر باستخدام واجهة سلسة.

    يجب أن تحتوي فئة ComputerBuilder على عضو خاص من نوع Computer تعمل على بنائه. Implement هذه الطرق، بحيث تعيد كل منها مرجعًا إلى builder لتمكين chaining بين الطرق:

    • setCPU(const std::string& cpu)
    • setRAM(const std::string& ram)
    • setStorage(const std::string& storage)
    • setGPU(const std::string& gpu)
    • addWifi(): enables إمكانية الاتصال بشبكة wifi

    Also Implement طريقة build() تعيد كائن Computer المكتمل وتعيد ضبط builder لإتاحة إعادة استخدامه.

  • main.cpp: اجمع كل شيء لبناء جهاز كمبيوتر مخصص.

    اقرأ أربعة inputs:

    1. طراز CPU (سلسلة نصية)
    2. مواصفات RAM (سلسلة نصية)
    3. مواصفات التخزين (سلسلة نصية)
    4. ما إذا كان ينبغي include wifi: yes أو no

    استخدم ComputerBuilder لبناء جهاز كمبيوتر باستخدام CPU وRAM والتخزين المقدمة. إذا كانت قيمة wifi هي yes، فاستدعِ أيضًا addWifi(). لاحظ أنه لم يتم تحديد GPU في هذه التهيئة: يجب أن يتعامل builder مع المكونات الاختيارية بسلاسة.

    بعد البناء، استدعِ showSpecs() على جهاز الكمبيوتر الناتج لعرض تهيئته.

يجب أن تُخرج طريقة showSpecs() البيانات بهذا التنسيق (مع عرض المكونات التي تم تعيينها فقط):

CPU: [value]
RAM: [value]
Storage: [value]
GPU: [value]
Wifi: Enabled

على سبيل المثال، باستخدام inputs هي Intel i7-12700K و32GB DDR5 و1TB NVMe SSD وyes:

CPU: Intel i7-12700K
RAM: 32GB DDR5
Storage: 1TB NVMe SSD
Wifi: Enabled

وباستخدام inputs هي AMD Ryzen 5 5600X و16GB DDR4 و512GB SSD وno:

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

لاحظ كيف يجعل نمط Builder عملية البناء مقروءة ومرنة. يمكنك بسهولة إضافة المكونات أو تخطيها، كما أن chaining بين الطرق ينشئ كودًا واضحًا وموضحًا لذاته. لا يظهر سطر GPU لأننا لم نعيّنه مطلقًا، مما يوضح كيفية تعامل builders مع المكونات الاختيارية بصورة طبيعية.

جرّب بنفسك

#include <iostream>
#include <string>
#include "ComputerBuilder.h"

using namespace std;

int main() {
    // اقرأ المدخلات
    string cpu, ram, storage, wifiChoice;
    getline(cin, cpu);
    getline(cin, ram);
    getline(cin, storage);
    getline(cin, wifiChoice);

    // TODO: أنشئ مثيلاً من ComputerBuilder
    
    // TODO: استخدم تسلسل الطرق لتعيين CPU و RAM و storage
    
    // TODO: إذا كان wifiChoice هو "yes"، استدعِ أيضاً addWifi()
    
    // TODO: استدعِ build() للحصول على كائن Computer
    
    // TODO: استدعِ showSpecs() على الحاسوب المُنشأ لعرض التكوين

    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C++ عبر الإنترنت