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

اذهب إلى أنماط التصميم #مصنع تجريدي

تم النشر بتاريخ 2024-11-01
تصفح:355

Go Design Patterns #Abstract Factory

Abstract Factory هو نمط تصميم إبداعي يتيح لك إنشاء كائنات ذات صلة دون تحديد فئاتها المحددة.

بيان المشكلة

تخيل أنك تقوم بتطوير مجموعة أدوات واجهة المستخدم الرسومية التي يجب أن تدعم معايير الشكل والمظهر المتعددة (مثل Windows وmacOS وLinux). يتطلب كل معيار من معايير الشكل والمظهر مجموعة مختلفة من مكونات واجهة المستخدم مثل الأزرار ومربعات الاختيار وأشرطة التمرير.

بدون نمط Abstract Factory، سيتعين عليك كتابة الكثير من التعليمات البرمجية الشرطية للتعامل مع إنشاء هذه المكونات بناءً على معيار الشكل والمظهر الحالي. هذا الأسلوب غير قابل للتطوير ويجعل من الصعب صيانة قاعدة التعليمات البرمجية وتوسيعها.

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

مثال في العالم الحقيقي

فكر في مصنع أثاث ينتج الكراسي والطاولات بأنماط مختلفة مثل الكلاسيكية والحديثة.

يتطلب كل نمط مجموعة مختلفة من المكونات (مثل الأرجل ومسند الظهر ومساند الأذرع) والمواد (مثل الخشب والمعادن والبلاستيك).

تطبيق

  • قم بتشغيل المثال عن طريق تشغيل go run Abstract-factory/main.go.
package main

import "fmt"

// Abstract Factory
type FurnitureFactory interface {
    MakeChair() Chair
    MakeTable() Table
}

func NewFurnitureFactory(style string) (FurnitureFactory, error) {
    if style == "classic" {
        return &Classic{}, nil
    }

    if style == "modern" {
        return &Modern{}, nil
    }

    return nil, fmt.Errorf("Style %s is not supported", style)
}

type Chair struct {
    Name     string
    Material string
}

type Table struct {
    Name     string
    Material string
}

// Concrete Classic Factory
type Classic struct{}

func (a *Classic) MakeChair() Chair {
    return Chair{
        Name:     "Classic Chair",
        Material: "Wood",
    }
}

func (a *Classic) MakeTable() Table {
    return Table{
        Name:     "Classic Table",
        Material: "Wood",
    }
}

// Concrete Modern Factory
type Modern struct{}

func (n *Modern) MakeChair() Chair {
    return Chair{
        Name:     "Modern Chair",
        Material: "Plastic",
    }
}

func (n *Modern) MakeTable() Table {
    return Table{
        Name:     "Modern Table",
        Material: "Plastic",
    }
}

func main() {
    factory, _ := NewFurnitureFactory("classic")

    chair := factory.MakeChair()
    table := factory.MakeTable()

    fmt.Printf("Chair: %s\n", chair.Name)
    fmt.Printf("Table: %s\n", table.Name)

    factory, _ = NewFurnitureFactory("modern")

    chair = factory.MakeChair()
    table = factory.MakeTable()

    fmt.Printf("Chair: %s\n", chair.Name)
    fmt.Printf("Table: %s\n", table.Name)
}

توضيح

يوضح هذا الكود نمط Abstract Factory من خلال إنشاء أثاث (كراسي وطاولات) بأنماط مختلفة (كلاسيكية وحديثة). فهو يحدد واجهة لإنشاء عائلات من الكائنات ذات الصلة والتطبيقات الملموسة لكل نمط، مما يتيح سهولة التوسع والصيانة.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/eduardoarndt/go-design-patterns-4-abstract-factory-971?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3