آموزش دیزاین پترن Flyweight در گولنگ

دیزاین پترن Flyweight یکی از الگوهای طراحی ساختاری (Structural Design Patterns) است که برای کاهش مصرف حافظه با اشتراک‌گذاری آبجکت‌های مشابه استفاده می‌شود. این الگو معمولاً زمانی مفید است که تعداد زیادی آبجکت داریم که مقادیر یکسان یا مشابهی دارند.


🎯 هدف Flyweight

کاهش استفاده از منابع با:

  • اشتراک‌گذاری داده‌های غیرقابل‌تغییر (immutable).

  • تفکیک داده‌ها به دو نوع:

    • Intrinsic (درونی): داده‌هایی که مشترک هستند و قابل اشتراک‌گذاری‌اند.

    • Extrinsic (بیرونی): داده‌هایی که خاص هر آبجکت هستند و نباید اشتراک‌گذاری شوند.


🧠 نکات مهم

  • این الگو زمانی مفید است که تعداد زیادی آبجکت داریم که قسمت زیادی از داده‌هایشان مشترک است.

  • داده‌های extrinsic نباید داخل آبجکت Flyweight نگهداری شوند.

  • کاربردهای واقعی:

    • گرافیک بازی‌ها (مثلاً یک میلیون درخت با ظاهر یکسان).

    • کش کردن فونت‌ها، آیکون‌ها، رنگ‌ها.

    • سیستم‌های text editor که هر حرف را به عنوان آبجکت نمایش می‌دهند.


✅ مثال ساده از Flyweight در Go

فرض کنیم می‌خواهیم آبجکت‌های زیادی از نوع Circle داشته باشیم ولی رنگ آن‌ها فقط چند رنگ ثابت است. بنابراین رنگ را به عنوان داده‌ی درونی (intrinsic) در نظر می‌گیریم:

package main

import "fmt"

// Flyweight (shared object)
type Circle struct {
    color string // intrinsic state
}

// Operation uses extrinsic state
func (c *Circle) Draw(x, y, radius int) {
    fmt.Printf("Drawing circle: color=%s, x=%d, y=%d, radius=%d
", c.color, x, y, radius)
}

// Flyweight Factory
type CircleFactory struct {
    circles map[string]*Circle
}

func NewCircleFactory() *CircleFactory {
    return &CircleFactory{circles: make(map[string]*Circle)}
}

func (f *CircleFactory) GetCircle(color string) *Circle {
    if circle, exists := f.circles[color]; exists {
       return circle
    }

    circle := &Circle{color: color}
    f.circles[color] = circle

    return circle
}

func main() {
    factory := NewCircleFactory()

    colors := []string{"red", "green", "blue", "red", "green"}

    for i, color := range colors {
       circle := factory.GetCircle(color)
       circle.Draw(i*10, i*20, 5)
    }
}

در مثال بالا ما یک فکتوری ساختیم که داخل میتونستیم یک دایره (Circle) یکسان درست کنیم با رنگ های مختلف. حالا شما میتونید در جاهایی که شی یکسان دارید از این پترن استفاده کنید.

1 🔥
0 🎉
0 😮
0 👍
0 💜
0 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁