"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > نمط تصميم البناء

نمط تصميم البناء

تم النشر بتاريخ 2024-08-31
تصفح:450

Builder Design Pattern

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

ما هو البناء؟

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

فوائد البناء

  • فصل البناء والتمثيل: يسمح بفصل بناء الكائن عن تمثيله النهائي.
  • البناء التزايدي: يسمح ببناء الكائنات المعقدة بشكل تدريجي وخطوة بخطوة.
  • إعادة استخدام الكود: يسهل إعادة استخدام الكود من خلال تحديد خطوات البناء الشائعة التي يمكن دمجها بطرق متعددة.

تنفيذ منشئ

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

1- تعريف الهيكل

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

// house.go

package main

type House struct {
    Foundation string
    Structure  string
    Roof       string
    Interior   string
}

2 - تعريف واجهة المنشئ

في نفس الملف، سنحدد واجهة Builder الخاصة بنا والتي تحدد الطرق اللازمة لبناء الأجزاء المختلفة من المنزل.

//house.go

package main

type House struct {
    Foundation string
    Structure  string
    Roof       string
    Interior   string
}

type HouseBuilder interface {
    SetFoundation()
    SetStructure()
    SetRoof()
    SetInterior()
    GetHouse() House
}

3- تنفيذ البناء بشكل خرساني

لنقم بإنشاء ملفين جديدين،concreteHouse وwoodHouse. سيكونون بمثابة تطبيق لفئة محددة تتبع واجهة HouseBuilder.

//concreteHouse.go

package main

type ConcreteHouseBuilder struct {
    house House
}

func (b *ConcreteHouseBuilder) SetFoundation() {
    b.house.Foundation = "Concrete, brick, and stone"
}

func (b *ConcreteHouseBuilder) SetStructure() {
    b.house.Structure = "Wood and brick"
}

func (b *ConcreteHouseBuilder) SetRoof() {
    b.house.Roof = "Concrete and reinforced steel"
}

func (b *ConcreteHouseBuilder) SetInterior() {
    b.house.Interior = "Gypsum board, plywood, and paint"
}

func (b *ConcreteHouseBuilder) GetHouse() House {
    return b.house
}
//woodHouse.go

package main

type WoodHouseBuilder struct {
    house House
}

func (b *WoodHouseBuilder) SetFoundation() {
    b.house.Foundation = "Wooden piles"
}

func (b *WoodHouseBuilder) SetStructure() {
    b.house.Structure = "Wooden frame"
}

func (b *WoodHouseBuilder) SetRoof() {
    b.house.Roof = "Wooden shingles"
}

func (b *WoodHouseBuilder) SetInterior() {
    b.house.Interior = "Wooden panels and paint"
}

func (b *WoodHouseBuilder) GetHouse() House {
    return b.house
}

4- تعريف المدير

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

//director.go

package main

type Director struct {
    builder HouseBuilder
}

func (d *Director) Build() {
    d.builder.SetFoundation()
    d.builder.SetStructure()
    d.builder.SetRoof()
    d.builder.SetInterior()
}

func (d *Director) SetBuilder(b HouseBuilder) {
    d.builder = b
}

5- استخدام المنشئ

أخيرًا، سوف نستخدم المدير وبناة الخرسانة لبناء أنواع مختلفة من المنازل.

//main.go

package main

import (
    "fmt"
)

func main() {
    cb := &builder.ConcreteHouseBuilder{}
    director := builder.Director{Builder: cb}

    director.Build()
    concreteHouse := cb.GetHouse()

    fmt.Println("Concrete House")
    fmt.Println("Foundation:", concreteHouse.Foundation)
    fmt.Println("Structure:", concreteHouse.Structure)
    fmt.Println("Roof:", concreteHouse.Roof)
    fmt.Println("Interior:", concreteHouse.Interior)
    fmt.Println("-------------------------------------------")

    wb := &builder.WoodHouseBuilder{}
    director.SetBuilder(wb)

    director.Build()
    woodHouse := wb.GetHouse()

    fmt.Println("Wood House")
    fmt.Println("Foundation:", woodHouse.Foundation)
    fmt.Println("Structure:", woodHouse.Structure)
    fmt.Println("Roof:", woodHouse.Roof)
    fmt.Println("Interior:", woodHouse.Interior)
}

باختصار

  1. البيت الهيكلي: يمثل المنتج النهائي الذي نقوم ببنائه.
  2. واجهة HouseBuilder: تحدد طرق بناء أجزاء المنزل المختلفة.
  3. التنفيذ الملموس (ConcreteHouseBuilder وWoodHouseBuilder): تنفيذ واجهة HouseBuilder وتحديد خطوات البناء المحددة.
  4. المدير: يدير عملية البناء، ويتأكد من استدعاء الخطوات بالترتيب الصحيح.
  5. الوظيفة الرئيسية: توضيح استخدام نمط البناء لبناء أنواع مختلفة من المنازل، واستدعاء المدير لإدارة العملية والحصول على المنتج النهائي.

خاتمة

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

بيان الافراج تم نشر هذه المقالة على: https://dev.to/rflpazini/builder-design-pattern-2hm3?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3