1. ফ্লাইওয়েট প্যাটার্ন কি
1.1 সংজ্ঞা এবং ধারণা
ফ্লাইওয়েট প্যাটার্ন হল একটি কাঠামো ডিজাইন প্যাটার্ন, যার প্রধান উদ্দেশ্য হল যোগদানকৃত অবজেক্টগুলির সংখ্যা সরাসরি কমানো, তাদের স্মৃতি সংরক্ষণ করা এবং কার্যক্ষমতা বাড়ানো। ফ্লাইওয়েট প্যাটার্ন অবজেক্ট সৃষ্টি এবং অবজেক্ট ব্যবহার অপেক্ষা কমিয়ে দেয়, যদিও এটা একই বা অনুরূপ অবজেক্টগুলি ভাগ করে এবং কার্যক্ষমতা অর্জন করে।
1.2 অন্যান্য ডিজাইন প্যাটার্ন থেকে পার্থক্য
অন্যান্য ডিজাইন প্যাটার্নগুলোর সাথে তুলনা করা যাকে, ফ্লাইওয়েট প্যাটার্ন প্রধানত অবজেক্টগুলি ভাগ এবং পুনর্ব্যবহার এর উপর গুরুত্ব দেয়। এটি অবজেক্টগুলি ভাগ করে অণ্যান্য ব্যাপারে কার্যক্ষমতা বাড়ানোর মাধ্যমে অবজেক্টগুলি থেকে স্মৃতি ও সূচনা ব্যয় কমায়।
2. ফ্লাইওয়েট প্যাটার্নের বৈশিষ্ট্য এবং সুবিধা
ফ্লাইওয়েট প্যাটার্নের প্রধান বৈশিষ্ট্য এবং সুবিধাগুলি হল:
- স্মৃতি ব্যবহারের সাংখ্যিকি নিমিত্তে: এটি একই বা অনুরূপ অবজেক্টগুলি ভাগ করে স্মৃতি ব্যবহার কমিয়ে দেয়।
- কার্যক্ষমতার অগ্রগতি: এটি অবজেক্টের সৃষ্টি এবং ধ্বংস কমিয়ে দেয়, যাতে সিস্টেমের অপারেশন দ্রুততা বাড়ানো যায়।
- বড় সংখ্যায় বিস্তৃত অবজেক্টের সমর্থন: এটি বড় সংখ্যায় এবং সুক্ষ্ম বিতরণযুক্ত অবজেক্ট তৈরি করতে পারে যেনো অধিক মেমোরি স্পেস না নেয়।
- সিস্টেম গঠন সহজ: অবজেক্টের অভ্যন্তরীণ এবং বাহ্যিক অবস্থান পৃথক করে, এটি সিস্টেমের গঠন এবং জটিলতা সরল করে।
3. ফ্লাইওয়েট প্যাটার্নের ব্যবহারের প্রায়োগিক উদাহরণ
ফ্লাইওয়েট প্যাটার্ন নিমিত্তে নিম্নলিখিত পরিস্থিতিতে ব্যবহার করা যেতে পারে:
- গেমে কণা অবজেক্ট: প্রতিটি কণা অবজেক্টের বৈশিষ্ট্য অভ্যন্তরীণ এবং বাহ্যিক অবস্থান ভাগ করা যায়, এবং একই বৈশিষ্ট্যযুক্ত কণা অবজেক্টগুলি ভাগ করা যেতে পারে।
- নেটওয়ার্ক সার্ভারে সংযোগ অবজেক্ট: সংযোগের উপাধি অবজেক্টের বৈশিষ্ট্য অভ্যন্তরীণ এবং বাহ্যিক অবস্থান ভাগ বা এখানেই এই বিদ্যমান সংযোগ অবজেক্ট পুনর্ব্যবহার করা।
4. গোলাংয়ে ফ্লাইওয়েট প্যাটার্নের অনুষ্ঠান
4.1 UML ক্লাস ডায়াগ্রাম
গোলাংয়ে ফ্লাইওয়েট প্যাটার্নের UML ক্লাস ডায়াগ্রাম নিম্নলিখিত:
4.2 উদাহরণের পরিচিতি
এই উদাহরণে, আমরা ফ্লাইওয়েট প্যাটার্নে ভিত্তি গ্রাফিক এডিটর তৈরি করব, যা বিভিন্ন রঙের বৃত্তগুলি ধারণ করে এবং একই রঙযুক্ত বৃত্তগুলি ভাগ করে স্মৃতি ব্যবহার কমিয়ে দেয়।
4.3 অনুষ্ঠানের ধাপ
4.3.1 ফ্লাইওয়েট ইন্টারফেস এবং কনক্রিট ফ্লাইওয়েট ক্লাস তৈরি
প্রথমে, আমাদের একটি Flyweight
ইন্টারফেস তৈরি করতে হবে যাতে ভাগ করা অবজেক্টের অপারেশনগুলি নির্ধারণ করা যায়। তারপরে, আমরা একটি ConcreteFlyweight
ক্লাস তৈরি করতে পারি যা Flyweight
ইন্টারফেসে গুরুত্ব দেয় এবং অভ্যন্তরীণ অবস্থান সহ অবজেক্টের ভিত্তি করে।
// Flyweight defines the interface of flyweight objects
type Flyweight interface {
Operation(extrinsicState string)
}
// ConcreteFlyweight represents the concrete flyweight object, implementing the Flyweight interface
type ConcreteFlyweight struct {
intrinsicState string
}
// Operation implements the operation method of the shared object
func (f *ConcreteFlyweight) Operation(extrinsicState string) {
fmt.Printf("Concrete flyweight object, internal state: %s, external state: %s\n", f.intrinsicState, extrinsicState)
}
4.3.2 ফ্লাইওয়েটফ্যাক্টরি ক্লাস তৈরি
পরবর্তীতে, আমরা একটি FlyweightFactory
ক্লাস তৈরি করতে পারি যাতে ফ্লাইওয়েট অবজেক্টগুলি পরিচালনা এবং ভাগ করতে পারি। এই ফ্যাক্টরি ক্লাসটির কাছে গৃহীত ফ্লাইওয়েট অবজেক্টগুলি সংরক্ষণ করার জন্য একটি flyweights
ডিকশনারি থাকে।
// FlyweightFactory class
type FlyweightFactory struct {
flyweights map[string]Flyweight
}
// GetFlyweight retrieves or creates a flyweight object from the factory
func (f *FlyweightFactory) GetFlyweight(key string) Flyweight {
if fw, ok := f.flyweights[key]; ok {
return fw
}
flyweight := &ConcreteFlyweight{
intrinsicState: key,
}
f.flyweights[key] = flyweight
return flyweight
}
4.3.3 ক্লায়েন্ট স্তরের উদাহরণ
শেষতঃ, আমরা গ্রাফিক এডিটরে ফ্লাইওয়েট প্যাটার্নকে ব্যবহার করতে কীভাবে তা দেখানোর জন্য একটি Client
ক্লাস তৈরি করতে পারি।
// Client class
type Client struct {
flyweight Flyweight
}
// Operation performs an operation
func (c *Client) Operation() {
c.flyweight.Operation("external state")
}
4.4.1 অবস্থা ভাগাভাগি এবং থ্রেড নিরাপত্তা
ফ্লাইওয়েট প্যাটার্ন ব্যবহার করার সময়, অভ্যন্তরীণ অবস্থার ভাগাভাগি এবং থ্রেড নিরাপত্তার উপর মনদিয় দেওয়া প্রয়োজন। কারণ ফ্লাইওয়েট অবজেক্টগুলি একাধিক ক্লায়েন্ট দ্বারা শেয়ার করা হয়, অবস্থার সংগতি নিশ্চিত করা দরকার।
4.4.2 অবজেক্ট পুল ব্যবস্থাপনা
ফ্লাইওয়েট অবজেক্টগুলি আরও ভালভাবে ব্যবহার এবং পুনরায় ব্যবহার করার জন্য, অবজেক্ট পুল ব্যবহার করা যেতে পারে যেখানে নির্মিত ফ্লাইওয়েট অবজেক্টগুলি সংরক্ষিত রাখা হয়। অবজেক্ট পুল অবজেক্টগুলির পুনরায় ব্যবহারের হার বাড়াতে পারে এবং অবজেক্ট সৃষ্টি এবং ধ্বংস এর ওভারহেড কমাতে পারে।
4.4.3 অবজেক্ট অবস্থা র বাহ্যিক ব্যবস্থাপনা
ফ্লাইওয়েট প্যাটার্ন অবজেক্টের অভ্যন্তরীণ অবস্থা এবং বাহ্যিক অবস্থা আলাদা করে, তবে বাহ্যিক অবস্থা ক্লায়েন্ট দ্বারা ব্যবস্থাপনা করা প্রয়োজন। ফ্লাইওয়েট অবজেক্টগুলি ব্যবহার করা যখন, ক্লায়েন্টকে ফ্লাইওয়েট অবজেক্টে বাহ্যিক অবস্থা পাঠাতে হয়।
Complete Code Example
নীচে একটি সম্পূর্ণ Golang কোড উদাহরণের একটি উদাহরণ দেয়া হয়েছে:
package main
import "fmt"
// Flyweight একটি ফ্লাইওয়েট অবজেক্টের ইন্টারফেস সংজ্ঞায়িত করে
type Flyweight interface {
Operation(extrinsicState string)
}
// ConcreteFlyweight একটি নির্দিষ্ট ফ্লাইওয়েট অবজেক্ট প্রতিনিধিত্ব করে এবং Flyweight ইন্টারফেস ইম্প্লিমেন্ট করে
type ConcreteFlyweight struct {
intrinsicState string
}
// Operation একটি শেয়ারড অবজেক্টের জন্য অপারেশন পারিবে
func (f *ConcreteFlyweight) Operation(extrinsicState string) {
fmt.Printf("কনক্রিট ফ্লাইওয়েট অবজেক্ট, অভ্যন্তরীণ অবস্থা: %s, বাহ্যিক অবস্থা: %s\n", f.intrinsicState, extrinsicState)
}
// FlyweightFactory ক্লাস
type FlyweightFactory struct {
flyweights map[string]Flyweight
}
// GetFlyweight ফ্যাক্টরিতে একটি ফ্লাইওয়েট অবজেক্ট পেতে অথবা তৈরি করতে সরে
func (f *FlyweightFactory) GetFlyweight(key string) Flyweight {
if fw, ok := f.flyweights[key]; ok {
return fw
}
flyweight := &ConcreteFlyweight{
intrinsicState: key,
}
f.flyweights[key] = flyweight
return flyweight
}
// Client ক্লাস
type Client struct {
flyweight Flyweight
}
// Operation ক্রিয়া পরিচালনা করে
func (c *Client) Operation() {
c.flyweight.Operation("বাহ্যিক অবস্থা")
}
func main() {
factory := &FlyweightFactory{
flyweights: make(map[string]Flyweight),
}
flyweight1 := factory.GetFlyweight("A")
flyweight1.Operation("বাহ্যিক অবস্থা 1")
flyweight2 := factory.GetFlyweight("B")
flyweight2.Operation("বাহ্যিক অবস্থা 2")
client := &Client{
flyweight: factory.GetFlyweight("A"),
}
client.Operation()
}