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

دیزاین پترن 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) یکسان درست کنیم با رنگ های مختلف. حالا شما میتونید در جاهایی که شی یکسان دارید از این پترن استفاده کنید.
اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁