Java Technologies Generics এর মাধ্যমে Design Pattern Implementation গাইড ও নোট

315

জেনেরিক্স ব্যবহারের মাধ্যমে জাভায় বিভিন্ন ডিজাইন প্যাটার্ন আরও নমনীয়, টাইপ সেফ, এবং পুনঃব্যবহারযোগ্য করা যায়। এতে কোড আরও পরিষ্কার এবং সহজবোধ্য হয়। এখানে জেনেরিক্স ব্যবহার করে কয়েকটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্নের উদাহরণ দেওয়া হলো।


1. Singleton Design Pattern

Singleton প্যাটার্ন নিশ্চিত করে যে একটি ক্লাসের একটি মাত্র ইনস্ট্যান্স তৈরি হয়। Generics ব্যবহার করে Singleton ক্লাস তৈরি করলে এটি টাইপ সেফ এবং পুনঃব্যবহারযোগ্য হয়।

Singleton Generics Implementation:

public class Singleton<T> {
    private static Singleton<?> instance;
    private T value;

    private Singleton(T value) {
        this.value = value;
    }

    @SuppressWarnings("unchecked")
    public static <T> Singleton<T> getInstance(T value) {
        if (instance == null) {
            instance = new Singleton<>(value);
        }
        return (Singleton<T>) instance;
    }

    public T getValue() {
        return value;
    }
}

// ব্যবহার:
public class Main {
    public static void main(String[] args) {
        Singleton<String> stringSingleton = Singleton.getInstance("Hello Generics!");
        System.out.println(stringSingleton.getValue());

        Singleton<Integer> intSingleton = Singleton.getInstance(42);
        System.out.println(intSingleton.getValue()); // Same instance used
    }
}

সুবিধা:

  • টাইপ সেফটি নিশ্চিত।
  • পুনঃব্যবহারযোগ্য Singleton ক্লাস।

2. Factory Design Pattern

Factory প্যাটার্ন ব্যবহার করে বিভিন্ন টাইপের অবজেক্ট তৈরি করা যায়। Generics ব্যবহার করলে এটি আরও নমনীয় হয় এবং টাইপ ইনফরমেশন ধরে রাখা যায়।

Factory Generics Implementation:

public class Factory<T> {
    private Class<T> type;

    public Factory(Class<T> type) {
        this.type = type;
    }

    public T createInstance() throws IllegalAccessException, InstantiationException {
        return type.newInstance();
    }
}

// ব্যবহার:
public class Main {
    public static void main(String[] args) {
        try {
            Factory<StringBuilder> factory = new Factory<>(StringBuilder.class);
            StringBuilder sb = factory.createInstance();
            sb.append("Hello, Factory Pattern!");
            System.out.println(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

সুবিধা:

  • একই Factory ক্লাস ব্যবহার করে বিভিন্ন টাইপের অবজেক্ট তৈরি করা যায়।
  • টাইপ কাস্টিংয়ের প্রয়োজন নেই।

3. Strategy Design Pattern

Strategy প্যাটার্ন ব্যবহার করে ডাইনামিক্যালি আলাদা আলাদা অ্যালগরিদম সিলেক্ট করা যায়। Generics এর মাধ্যমে Strategy প্যাটার্ন টাইপ সেফ এবং পুনঃব্যবহারযোগ্য করা যায়।

Strategy Generics Implementation:

public interface Strategy<T> {
    void execute(T data);
}

public class PrintStrategy implements Strategy<String> {
    @Override
    public void execute(String data) {
        System.out.println("Printing: " + data);
    }
}

public class SquareStrategy implements Strategy<Integer> {
    @Override
    public void execute(Integer data) {
        System.out.println("Square: " + (data * data));
    }
}

// ব্যবহার:
public class Main {
    public static void main(String[] args) {
        Strategy<String> printStrategy = new PrintStrategy();
        printStrategy.execute("Generics with Strategy!");

        Strategy<Integer> squareStrategy = new SquareStrategy();
        squareStrategy.execute(5);
    }
}

সুবিধা:

  • টাইপ সুনির্দিষ্টভাবে বিভিন্ন স্ট্রাটেজি হ্যান্ডল করা যায়।
  • সহজে নতুন স্ট্রাটেজি যোগ করা যায়।

4. Observer Design Pattern

Observer প্যাটার্নে একাধিক অবজার্ভার অবজেক্টকে একটি সাবজেক্টে সংযুক্ত করা হয়। Generics ব্যবহার করে বিভিন্ন টাইপের অবজার্ভার সহজে পরিচালনা করা যায়।

Observer Generics Implementation:

import java.util.ArrayList;
import java.util.List;

public class Subject<T> {
    private List<Observer<T>> observers = new ArrayList<>();

    public void addObserver(Observer<T> observer) {
        observers.add(observer);
    }

    public void notifyObservers(T data) {
        for (Observer<T> observer : observers) {
            observer.update(data);
        }
    }
}

public interface Observer<T> {
    void update(T data);
}

// ব্যবহার:
public class StringObserver implements Observer<String> {
    @Override
    public void update(String data) {
        System.out.println("String Observer: " + data);
    }
}

public class IntegerObserver implements Observer<Integer> {
    @Override
    public void update(Integer data) {
        System.out.println("Integer Observer: " + data);
    }
}

public class Main {
    public static void main(String[] args) {
        Subject<String> stringSubject = new Subject<>();
        stringSubject.addObserver(new StringObserver());
        stringSubject.notifyObservers("Hello Observers!");

        Subject<Integer> integerSubject = new Subject<>();
        integerSubject.addObserver(new IntegerObserver());
        integerSubject.notifyObservers(42);
    }
}

সুবিধা:

  • একাধিক টাইপের অবজার্ভার ব্যবস্থাপনা সহজ।
  • টাইপ কাস্টিংয়ের প্রয়োজন নেই।

5. Builder Design Pattern

Builder প্যাটার্ন ব্যবহার করে জটিল অবজেক্ট ধাপে ধাপে তৈরি করা হয়। Generics ব্যবহার করে এটি আরও ফ্লেক্সিবল করা যায়।

Builder Generics Implementation:

public class Builder<T> {
    private T instance;

    public Builder(T instance) {
        this.instance = instance;
    }

    public T build() {
        return instance;
    }

    public Builder<T> withProperty(String property) {
        System.out.println("Setting property: " + property);
        return this;
    }
}

// ব্যবহার:
public class Main {
    public static void main(String[] args) {
        Builder<StringBuilder> builder = new Builder<>(new StringBuilder());
        StringBuilder sb = builder.withProperty("Custom Property").build();
        sb.append("Hello, Builder Pattern!");
        System.out.println(sb.toString());
    }
}

সুবিধা:

  • বিভিন্ন টাইপের অবজেক্ট ধাপে ধাপে তৈরি করা যায়।
  • টাইপ সেফটি নিশ্চিত।

Generics ডিজাইন প্যাটার্ন বাস্তবায়নে টাইপ সেফটি, পুনঃব্যবহারযোগ্যতা, এবং ফ্লেক্সিবিলিটি নিশ্চিত করে। জাভার বিভিন্ন ডিজাইন প্যাটার্ন যেমন Singleton, Factory, Strategy, Observer, এবং Builder-এ Generics ব্যবহারে টাইপ সম্পর্কিত ত্রুটি এড়ানো যায় এবং কোড আরও পরিষ্কার ও কার্যকর হয়।

Content added By
Promotion

Are you sure to start over?

Loading...