Flyweight Pattern

Structural Design Patterns - জাভায় ডিজাইন প্যাটার্ন (Design Patterns in Java) - Java Technologies

228

Flyweight Pattern কি?

Flyweight Pattern হল একটি Structural Design Pattern যা মূলত মেমরি অপটিমাইজেশন (memory optimization) এর জন্য ব্যবহৃত হয়। এটি এমন একটি কৌশল যা অনেকগুলো অবজেক্টের মধ্যে শেয়ার করা তথ্য বা স্টেট ব্যবহার করে, যাতে মেমরির ব্যবহার কমানো যায়। এই প্যাটার্নটি বিশেষ করে তখন ব্যবহৃত হয়, যখন অনেক অবজেক্ট একই বা প্রায় একই স্টেট ধারণ করে এবং এই অবজেক্টগুলির একাধিক ইনস্ট্যান্স তৈরি করা হয়ে থাকে।

Flyweight Pattern এ দুটি ধরনের ডেটা থাকে:

  1. Intrinsic State: তথ্য যা একটি অবজেক্টের মধ্যে শেয়ার করা হয় (যা অভ্যন্তরীণ তথ্য বা স্টেট)।
  2. Extrinsic State: তথ্য যা অবজেক্টের মধ্যে শেয়ার করা যায় না এবং প্রতিটি অবজেক্টের জন্য আলাদা থাকে (যে তথ্য প্লেসহোল্ডার হিসেবে থাকে এবং অবজেক্টের বাহ্যিক অবস্থা নির্ধারণ করে)।

Flyweight Pattern মূলত "Shareable Objects" তৈরি করে যাতে মেমরি খরচ কমানো যায়।


Flyweight Pattern এর উপাদান:

  1. Flyweight Interface: এটি শেয়ারযোগ্য অবজেক্টের সাধারণ ইন্টারফেস।
  2. ConcreteFlyweight: এটি Flyweight ইন্টারফেসের কনক্রিট ক্লাস, যেখানে শেয়ারযোগ্য স্টেট থাকবে।
  3. FlyweightFactory: এটি একটি ফ্যাক্টরি ক্লাস যা নিশ্চিত করে যে একই অবজেক্টের একটি একক ইনস্ট্যান্স ব্যবহৃত হবে এবং তা পুনরায় শেয়ার করা হবে।
  4. Client: ক্লায়েন্ট কোড যেটি Flyweight অবজেক্ট ব্যবহার করে এবং বাহ্যিক স্টেট পাস করে।

Flyweight Pattern এর উদাহরণ

ধরা যাক, একটি সফটওয়্যার সিস্টেমে গেমের চরিত্র তৈরি করা হচ্ছে, যেখানে অনেক চরিত্র একই ধরনের বৈশিষ্ট্য শেয়ার করবে, যেমন গেমের চরিত্রের রং বা সাইজ। Flyweight Pattern ব্যবহার করে আমরা এই ধরনের অবজেক্টের জন্য মেমরি অপটিমাইজেশন করতে পারি, কারণ চরিত্রগুলির শেয়ারযোগ্য বৈশিষ্ট্য একাধিকবার তৈরি করার পরিবর্তে শেয়ার করা হবে।

Step 1: Flyweight Interface

// Flyweight Interface
public interface Character {
    void draw(int x, int y);  // Method to draw the character at a specific position
}

Step 2: ConcreteFlyweight

// ConcreteFlyweight: Specific character (like 'A', 'B', etc.)
public class ConcreteCharacter implements Character {
    private char symbol;  // Intrinsic state (shared)

    // Constructor to set the symbol (shared state)
    public ConcreteCharacter(char symbol) {
        this.symbol = symbol;
    }

    @Override
    public void draw(int x, int y) {
        System.out.println("Drawing " + symbol + " at (" + x + ", " + y + ")");
    }
}

Step 3: FlyweightFactory

import java.util.HashMap;
import java.util.Map;

// FlyweightFactory: Ensures shared instances of characters
public class CharacterFactory {
    private Map<Character, Character> characterMap;

    public CharacterFactory() {
        characterMap = new HashMap<>();
    }

    public Character getCharacter(char symbol) {
        if (!characterMap.containsKey(symbol)) {
            characterMap.put(symbol, new ConcreteCharacter(symbol));
        }
        return characterMap.get(symbol);
    }
}

Step 4: Client

public class FlyweightPatternExample {
    public static void main(String[] args) {
        CharacterFactory factory = new CharacterFactory();

        // Reusing character objects instead of creating new ones
        Character characterA = factory.getCharacter('A');
        characterA.draw(1, 1);

        Character characterB = factory.getCharacter('B');
        characterB.draw(2, 3);

        // Reuse the 'A' object
        Character characterA2 = factory.getCharacter('A');
        characterA2.draw(4, 5);

        // Check if 'A' and 'A2' are the same instance
        System.out.println(characterA == characterA2);  // Output: true
    }
}

ব্যাখ্যা:

  1. ConcreteCharacter: এটি একটি কনক্রিট ক্লাস যা Character ইন্টারফেসকে ইমপ্লিমেন্ট করে এবং গেম চরিত্রের intrinsic state (যেমন, চরিত্রের চিহ্ন বা symbol) ধারণ করে। একে একাধিক গেমের চরিত্রের জন্য শেয়ার করা হয়।
  2. CharacterFactory: এটি Flyweight অবজেক্ট তৈরি এবং পুনরায় ব্যবহারের দায়িত্বে থাকে। CharacterFactory নিশ্চিত করে যে 'A' এর জন্য শুধুমাত্র একটি অবজেক্ট তৈরি হবে, এবং সেটা পুনরায় ব্যবহার করা যাবে।
  3. Client: ক্লায়েন্ট কোড CharacterFactory এর মাধ্যমে Character অবজেক্ট ব্যবহার করে এবং বিভিন্ন অবস্থানে (x, y) সেট করে প্রদর্শন করে।

Flyweight Pattern এর সুবিধা:

  1. Memory Optimization: Flyweight Pattern মূলত মেমরি অপটিমাইজেশনে ব্যবহৃত হয়, কারণ এটি শেয়ারযোগ্য অবজেক্টের একাধিক ইনস্ট্যান্স তৈরি না করে একই ইনস্ট্যান্স ব্যবহার করে।
  2. Improved Performance: অনেক অবজেক্টের জন্য একই ডেটা ব্যবহার করতে পারলে, এটি কর্মক্ষমতা বৃদ্ধি করতে পারে।
  3. Separation of Intrinsic and Extrinsic States: Flyweight Pattern এর মাধ্যমে আপনি অবজেক্টের শেয়ারযোগ্য অংশ এবং বাহ্যিক অংশ আলাদা করতে পারেন, যা কোডের গঠন এবং রক্ষণাবেক্ষণ সহজ করে।

Flyweight Pattern এর ব্যবহার:

  1. Text Formatting: টেক্সট এডিটর বা ওয়েব পেজে বিভিন্ন চরিত্রের ফন্ট এবং স্টাইল শেয়ার করা।
  2. Rendering Large Sets of Objects: গেমে অনেক চরিত্র বা ইউনিট যেখানে একই ধরনের অবস্থা শেয়ার করা হয়, যেমন গেমে বিভিন্ন ইউনিটের অবস্থান এবং ধরণ।
  3. Graphics Rendering: গ্রাফিক্স সিস্টেমে অনেক অবজেক্টের জন্য একই ধরনের গ্রাফিক্যাল উপাদান শেয়ার করা।

সারাংশ

Flyweight Pattern হল একটি মেমরি অপটিমাইজেশন প্যাটার্ন যা অবজেক্ট তৈরি করার প্রক্রিয়ায় শেয়ার করা উপাদান ব্যবহার করে মেমরি খরচ কমায়। এটি যখন অনেক অবজেক্ট একে অপরের মতো একই বা প্রায় একই ডেটা শেয়ার করে, তখন এই প্যাটার্নটি খুব কার্যকরী হয়ে ওঠে। Intrinsic state শেয়ার করা হয়, কিন্তু extrinsic state (বাহ্যিক স্টেট) প্রতিটি অবজেক্টের জন্য আলাদা থাকে। Flyweight Pattern ব্যবহার করে আমরা মেমরি ব্যবহারে সাশ্রয়ী হতে পারি এবং বড় সিস্টেমের পারফরম্যান্স উন্নত করতে পারি।

Content added By
Promotion

Are you sure to start over?

Loading...