يتم استخدام نمط تصميم المنشئ لبناء كائنات معقدة بشكل تدريجي، مما يسمح بإنشاء تمثيلات مختلفة للكائن باستخدام نفس عملية البناء. في هذه المقالة، سوف نستكشف كيفية تنفيذ نمط Builder في Golang، وفهم فوائده، وتحليل مثال عملي للاستخدام.
يفصل نمط البناء بناء كائن معقد عن تمثيله، مما يسمح لنفس عملية البناء بإنشاء تمثيلات مختلفة. يعد هذا مفيدًا بشكل خاص عندما يلزم إنشاء كائن في خطوات متعددة أو باستخدام تكوينات متعددة محتملة.
لتنفيذ منشئنا، دعونا نتخيل كائنًا معقدًا حيث سيكون من الضروري تهيئة عدة حقول وحتى كائنات مجمعة أخرى. ماذا عن المنزل؟ حيث سيكون لدينا نوعين من البناء، نوع تقليدي حيث سيتم استخدام الخرسانة والطوب، والثاني مصنوع من الخشب.
أولاً، نحتاج إلى تحديد بنية الكائن الذي نريد بنائه. كما قلنا من قبل، سنقوم ببناء منزل. داخل هذا الهيكل سنضع ما هو ضروري لإنشاء واحد.
// house.go package main type House struct { Foundation string Structure string Roof string Interior string }
في نفس الملف، سنحدد واجهة 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 }
لنقم بإنشاء ملفين جديدين،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 }
المدير هو فئة تدير بناء الكائن، مما يضمن استدعاء خطوات البناء بالترتيب الصحيح. إنه لا يعرف شيئًا عن تفاصيل تطبيقات 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 }
أخيرًا، سوف نستخدم المدير وبناة الخرسانة لبناء أنواع مختلفة من المنازل.
//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) }
يعد نمط Builder أداة لبناء كائنات معقدة بطريقة تدريجية ومرنة. في جولانج، يتم تنفيذ هذا النمط بشكل مباشر وفعال، مما يسمح بإنشاء أنظمة معيارية وسهلة الصيانة. باستخدام واجهات وفئات ملموسة، يمكننا مركزية منطق البناء وتبسيط تطور التعليمات البرمجية مع ظهور متطلبات جديدة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3