Guice Dependency Injection Framework এ Complex Object Creation এর জন্য Provider ব্যবহার একটি শক্তিশালী কৌশল। Provider একটি ইন্টারফেস যা Guice-কে অবজেক্ট তৈরি এবং ইনজেকশন করার জন্য কাস্টম লজিক প্রয়োগ করতে সক্ষম করে। এটি খুবই কার্যকর যখন আপনি এমন অবজেক্ট তৈরি করতে চান যা কিছু নির্দিষ্ট কনফিগারেশন বা কন্ডিশন অনুযায়ী পরিবর্তিত হতে পারে।
Guice-এ Provider ব্যবহার করার মাধ্যমে আপনি Lazy Instantiation, Conditional Logic, এবং Complex Object Creation যেমন Factory Pattern বা Prototype Pattern ব্যবহার করতে পারেন।
নিচে Guice Provider এর ব্যবহার, সুবিধা এবং উদাহরণ আলোচনা করা হয়েছে।
Provider Interface
Provider<T> একটি সাধারণ ইন্টারফেস যা একটি get() মেথড প্রদান করে। এই মেথডটি ডিপেন্ডেন্সি প্রদান করে, কিন্তু এটি কেবল তখনই অবজেক্ট তৈরি করে যখন এটি প্রয়োজন হয়, অর্থাৎ এটি Lazy Instantiation প্রদান করে।
public interface Provider<T> {
T get();
}
Provider এর মাধ্যমে, আপনি Complex Object Creation পরিচালনা করতে পারবেন যেখানে অবজেক্টটি কাস্টম লজিক, প্রপার্টি বা প্যারামিটার অনুসারে তৈরি করা হয়।
Provider ব্যবহার করে Complex Object Creation
Step 1: Guice Module Configuration
প্রথমে, Guice মডিউলে Provider কে কনফিগার করতে হবে যাতে অবজেক্টগুলি কাস্টমভাবে তৈরি করা যায়।
Step 2: Provider Implementation
Provider<T> ইন্টারফেসের একটি কাস্টম ক্লাস তৈরি করতে হবে যেখানে অবজেক্ট তৈরির লজিক থাকবে।
Step 3: Injector ব্যবহার করা
এবার, Guice Injector ব্যবহার করে আপনার কনফিগার করা Provider এর মাধ্যমে অবজেক্ট ইনস্ট্যান্স করা হবে।
উদাহরণ: Complex Object Creation
ধরা যাক, আপনি একটি Service ক্লাস তৈরি করতে চান, এবং এটি কিছু নির্দিষ্ট কনফিগারেশনের ভিত্তিতে আলাদা আলাদা আচরণ করবে। এই কাজটি Provider ব্যবহার করে কিভাবে করা যায়, তা নিচে দেখানো হয়েছে।
1. Service ক্লাস (Complex Object)
public class Service {
private final String config;
// Constructor with configuration
public Service(String config) {
this.config = config;
}
public void execute() {
System.out.println("Executing service with config: " + config);
}
}
এখানে, Service ক্লাসটি কনফিগারেশন হিসেবে একটি String নেয়। আমরা Provider ব্যবহার করে এই কনফিগারেশন অনুযায়ী অবজেক্ট তৈরি করতে পারব।
2. ServiceProvider (Provider Implementation)
import com.google.inject.Provider;
public class ServiceProvider implements Provider<Service> {
private final String config;
public ServiceProvider(String config) {
this.config = config;
}
@Override
public Service get() {
// Complex logic for object creation
return new Service(config);
}
}
এখানে ServiceProvider ক্লাসটি Provider<Service> ইন্টারফেস ইমপ্লিমেন্ট করেছে। get() মেথডটি Service ক্লাসের একটি ইনস্ট্যান্স তৈরি করবে এবং কনফিগারেশন প্যারামিটার হিসেবে config নিবে।
3. Guice Module (Dependency Configuration)
import com.google.inject.AbstractModule;
public class MyModule extends AbstractModule {
@Override
protected void configure() {
// Bind the Provider with configuration
bind(Service.class).toProvider(ServiceProvider.class);
}
}
এখানে, Service ক্লাসের জন্য Provider<Service> বাইনড করা হয়েছে। ServiceProvider কনফিগারেশনের মাধ্যমে Service ইনস্ট্যান্স তৈরি করবে।
4. Application (Using Provider for Lazy Instantiation)
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Application {
private final Service service;
// Constructor injection
public Application(Service service) {
this.service = service;
}
public void start() {
service.execute();
}
public static void main(String[] args) {
// Create injector and pass the module
Injector injector = Guice.createInjector(new MyModule());
// Pass configuration while creating the ServiceProvider
Service service = injector.getInstance(Service.class);
Application app = new Application(service);
// Start the service
app.start();
}
}
এখানে, Guice Injector ব্যবহার করে Service ইনস্ট্যান্সটি ইনজেক্ট করা হচ্ছে। Guice নিশ্চিত করবে যে ServiceProvider ঠিকভাবে কাজ করবে এবং একটি কাস্টম কনফিগারেশনের সাথে Service তৈরি হবে।
Lazy Instantiation and Complex Logic
একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা Provider ব্যবহার করার মাধ্যমে পাওয়া যায় তা হলো Lazy Instantiation। Provider অবজেক্টটি কেবল তখনই তৈরি করবে যখন তা সত্যিকার অর্থে প্রয়োজন হবে। এটি প্রোগ্রামটির পারফরম্যান্স এবং রিসোর্স ব্যবস্থাপনায় সহায়তা করতে পারে।
উদাহরণস্বরূপ, Service ক্লাসের কনফিগারেশন যদি একটি বড় ডেটাবেস কনফিগারেশন বা অন্য কোন ভারী অপারেশন হিসেবে থাকে, তাহলে আপনি প্রথমবার ব্যবহার না হওয়া পর্যন্ত অবজেক্ট তৈরি করতে চাইবেন না। Provider সেই পরিস্থিতিতে আদর্শ।
Additional Complex Object Creation with Provider
Factory Pattern with Provider
Provider ব্যবহার করে আপনি Factory Pattern প্রয়োগ করতে পারেন, যেখানে আপনি ডায়নামিকভাবে অবজেক্ট তৈরি করতে পারেন।
import com.google.inject.Provider;
public class ServiceFactory implements Provider<Service> {
private final String config;
public ServiceFactory(String config) {
this.config = config;
}
@Override
public Service get() {
return new Service(config); // Complex object creation logic
}
}
এখানে, ServiceFactory একটি Factory Pattern হিসেবে কাজ করছে এবং এটি একটি Service অবজেক্ট তৈরি করছে যেটি config প্যারামিটার নিতে পারে।
Prototype Pattern with Provider
Provider ব্যবহার করে Prototype Pattern প্রয়োগ করাও সম্ভব, যেখানে একই টাইপের বিভিন্ন ইনস্ট্যান্স তৈরি করতে পারেন।
public class PrototypeService implements Provider<Service> {
private final String config;
public PrototypeService(String config) {
this.config = config;
}
@Override
public Service get() {
return new Service(config); // Return a new instance every time
}
}
এখানে, প্রতি get() কলের সাথে একটি নতুন Service ইনস্ট্যান্স তৈরি হবে, যা Prototype Pattern এর সাথে সঙ্গতিপূর্ণ।
Guice Provider একটি খুবই কার্যকর উপায় Complex Object Creation এর জন্য, যেখানে আপনি কাস্টম লজিক প্রয়োগ করে অবজেক্ট তৈরি করতে পারেন। Provider ব্যবহারের মাধ্যমে আপনি Lazy Instantiation, Factory Pattern, এবং Prototype Pattern প্রয়োগ করতে পারবেন। এটি নিশ্চিত করে যে অবজেক্টটি কেবল তখনই তৈরি হবে যখন তার প্রয়োজন হবে, ফলে অ্যাপ্লিকেশনের পারফরম্যান্স এবং রিসোর্স ব্যবস্থাপনায় উন্নতি ঘটে।
Read more