Creational Design Patterns
Creational Design Pattern আমাদের বলে দেয় কিভাবে একটি অবজেক্ট তৈরি করা হবে। বিভিন্ন অবজেক্টের কাজ একেক রকম হয়, আর সেই প্রয়োজনীয়তার ভিত্তিতে তাদের তৈরি করার পদ্ধতিও আলাদা হয়। উল্লেখযোগ্য কিছু Creational Design Pattern হল:
- 1. Prototype
- 2. Singleton
- 3. Factory
- 4. Abstract Factory
- 5. Builder
Prototype Design Pattern
Prototype Design Pattern হলো সবচেয়ে সহজ Design Patternগুলোর একটি। এখানে একটি বিদ্যমান অবজেক্ট কপি করে নতুন অবজেক্ট তৈরি করা হয়।
এই প্যাটার্নের চারটি উপাদান আছে:
- ১। Prototype Interface বা Abstract Class
- ২। Concrete Prototype
- ৩। Clone Method
- ৪। Client
// 1. Prototype Interface or Abstract Class
class Prototype {
clone() {
throw new Error('Method "clone()" must be implemented.');
}
}
// 2. Concrete Prototype
class ConcretePrototype extends Prototype {
constructor(name) {
super();
this.name = name;
}
// 4. Implementing the clone method
clone() {
// Create a new instance and copy the properties from the current instance
return new ConcretePrototype(this.name);
}
toString() {
return `ConcretePrototype with name: ${this.name}`;
}
}
// 3. Client
function clientCode(prototype) {
const clone = prototype.clone();
console.log(clone.toString());
}
Explanation:
► Prototype হচ্ছে একটি abstract class, যা clone method-এর জন্য একটি interface তৈরি করে।
► ConcretePrototype হলো সেই ক্লাস, যা Prototype থেকে clone method নিজের মধ্যে বাস্তবায়ন করে।
► Client-এর কাজ হলো ConcretePrototype class থেকে clone method ব্যবহার করে নতুন object তৈরি করা।
Singelton Design Pattern
Singleton Design Pattern-এ একটি ইন্সট্যান্স একবারই তৈরি করা হয় এবং পরে আবার ইন্সট্যান্স তৈরি করতে চাইলে আগের ইন্সট্যান্সটাই রিটার্ন করা হয়, যতক্ষণ সেটা মেমরিতে থাকে।
Initialization Types:
1. Eager Initialization: ইন্সট্যান্স তখনই তৈরি হয় যখন ক্লাসটি লোড হয়।
class EagerSingleton {
static instance = new EagerSingleton(); // ইন্সট্যান্স শুরুতেই তৈরি হয়
constructor() {
if (EagerSingleton.instance) {
return EagerSingleton.instance;
}
EagerSingleton.instance = this;
}
}
const instance1 = EagerSingleton.instance;
const instance2 = EagerSingleton.instance;
console.log(instance1 === instance2); // true (একই ইন্সট্যান্স)
2. Lazy Initialization: ইন্সট্যান্স শুধুমাত্র প্রয়োজন হলে তৈরি করা হয়।
class LazySingleton {
constructor() {
if (!LazySingleton.instance) {
// ইন্সট্যান্স যখন প্রয়োজন তখনই তৈরি হবে
LazySingleton.instance = this;
// অন্যান্য প্রপার্টি এখানে ইনিশিয়ালাইজ করা যাবে
}
return LazySingleton.instance;
}
}
Private Static Instance:
ক্লাসে একটি প্রাইভেট স্ট্যাটিক ইন্সট্যান্স থাকে, যা নিশ্চিত করে যে ক্লাসের মাত্র একটি অবজেক্ট তৈরি হয়। এটা একাধিক ইন্সট্যান্স তৈরি হতে দেয় না।
Private Constructor:
কনস্ট্রাক্টর সাধারণত প্রাইভেট বা প্রোটেক্টেড থাকে, যাতে কেউ নতুন কিওয়ার্ড দিয়ে নতুন ইন্সট্যান্স তৈরি করতে না পারে। জাভাস্ক্রিপ্টে, আপনি চেক করেন যে আগেই কোনো ইন্সট্যান্স আছে কিনা।
Global Access Point:
সিঙ্গেলটন একটি মেথড (যেমন getInstance() বা সরাসরি ইন্সট্যান্স রিটার্ন) দেয়, যা দিয়ে একক ইন্সট্যান্স অ্যাক্সেস করা যায়।
Thread-Safety (in multi-threaded environments):
যেসব ভাষা মাল্টি-থ্রেডিং সমর্থন করে, সেখানে সিঙ্গেলটনকে থ্রেড-সেফ হতে হবে, যাতে একাধিক থ্রেড একই সময় একাধিক ইন্সট্যান্স তৈরি করতে না পারে। এটা লকিং বা সিঙ্ক্রোনাইজেশনের মাধ্যমে অর্জন করা যায়।
Factory Design Pattern
একটা ফ্যাক্টরিতে যেভাবে কোনো কিছু তৈরি হয় factory pattern এও একটা factory ক্লাস থাকে যার কাজ হচ্ছে ইন্সট্যান্স তৈরি করা। এরও কিছু কম্পনেন্ট থাকে ।
Creator/Factory Class
class VehicleFactory {
createVehicle() {
throw new Error("This method must be overridden!");
}
}
VehicleFactory হলো একটি অ্যাবস্ট্রাক্ট ক্লাস, যা createVehicle মেথডের জন্য একটি ইন্টারফেস সরবরাহ করে। এই মেথডটি সাবক্লাসগুলোর দ্বারা ওভাররাইড করতে হবে।
Concrete Factory Classes
class CarFactory extends VehicleFactory {
createVehicle() {
// Concrete Product Class
return new Car();
}
}
class BikeFactory extends VehicleFactory {
createVehicle() {
// Concrete Product Class
return new Bike();
}
}
🟢 CarFactoryএবংBikeFactoryহলো কনক্রিট ফ্যাক্টরি ক্লাস। এগুলোVehicleFactoryথেকে ইনহেরিট করে এবংcreateVehicleমেথডের বাস্তবায়ন প্রদান করে।🟢 CarFactoryএকটিCarঅবজেক্ট তৈরি করে, আরBikeFactoryএকটিBikeঅবজেক্ট তৈরি করে।
Client Code
const carFactory = new CarFactory();
const car = carFactory.createVehicle();
car.drive(); // Output: Driving a car
const bikeFactory = new BikeFactory();
const bike = bikeFactory.createVehicle();
bike.drive(); // Output: Riding a bike
এখানে ক্লায়েন্ট কোডে CarFactory এবং BikeFactory ব্যবহার করা হচ্ছে। ক্লায়েন্ট ফ্যাক্টরি ক্লাসগুলোকে কল করে Car এবং Bike অবজেক্ট তৈরি করছে .
Abstract Factory
Abstract Factory হলো Factory Pattern-এর একটি বাড়তি লেয়ার। এই ডিজাইন প্যাটার্নে সম্পর্কিত বা একই গ্রুপের অবজেক্ট তৈরি করা হয়, যেখানে দুই বা তার বেশি ফ্যাক্টরি থাকে।
Abstract Products
class Car {
drive() {
throw new Error("This method should be overridden");
}
}
class Bike {
ride() {
throw new Error("This method should be overridden");
}
}
Car এবং Bike হল অ্যাবস্ট্রাক্ট প্রোডাক্ট ক্লাস, যেগুলোতে ড্রাইভ এবং রাইড করার জন্য মেথড রয়েছে। এগুলোকে সাবক্লাসের মাধ্যমে বাস্তবায়ন করতে হবে।
Concrete Products
// Electric Car
class ElectricCar extends Car {
drive() {
console.log("Driving an electric car");
}
}
// Gas Car
class GasCar extends Car {
drive() {
console.log("Driving a gas car");
}
}
// Electric Bike
class ElectricBike extends Bike {
ride() {
console.log("Riding an electric bike");
}
}
// Gas Bike
class GasBike extends Bike {
ride() {
console.log("Riding a gas bike");
}
}
🟢ElectricCarএবংGasCarহলো কনক্রিট প্রোডাক্ট ক্লাস, যেগুলোCarক্লাস থেকে ইনহেরিট করে। এদের ড্রাইভ করার পদ্ধতি ভিন্ন।🟢ElectricBikeএবংGasBikeও একইভাবেBikeক্লাস থেকে ইনহেরিট করে, তাদের রাইড করার পদ্ধতি ভিন্ন।
Abstract Factory
class VehicleFactory {
createCar() {
throw new Error("This method should be overridden");
}
createBike() {
throw new Error("This method should be overridden");
}
}
VehicleFactory হল একটি অ্যাবস্ট্রাক্ট ফ্যাক্টরি ক্লাস, যা createCar এবং createBike মেথডের জন্য একটি ইন্টারফেস সরবরাহ করে।
Concrete Factories
// Factory to create Electric Vehicles
class ElectricVehicleFactory extends VehicleFactory {
createCar() {
return new ElectricCar();
}
createBike() {
return new ElectricBike();
}
}
// Factory to create Gas Vehicles
class GasVehicleFactory extends VehicleFactory {
createCar() {
return new GasCar();
}
createBike() {
return new GasBike();
}
}
🟢ElectricVehicleFactoryএবংGasVehicleFactoryহলো কনক্রিট ফ্যাক্টরি ক্লাস।🟢ElectricVehicleFactoryElectricCarএবংElectricBikeতৈরি করে, আরGasVehicleFactoryGasCarএবংGasBikeতৈরি করে।
factory এবং abstract factory pattern এর মধ্যে পার্থক্য হচ্ছে এদের abstraction level , class এর সংখ্যা ।
Builder Pattern
Builder Pattern ব্যবহার করে জটিল অবজেক্টগুলো ধাপে ধাপে তৈরি করা হয়। এরও অনেক কম্পনেন্ট আছে । যেমন ঃ
Product
class Form {
constructor() {
this.fields = [];
}
addField(field) {
this.fields.push(field);
}
render() {
this.fields.forEach(field => console.log(`Field: ${field.type}, Label: ${field.label}`));
}
}
Form ক্লাসটি একটি ফর্মের বিভিন্ন ক্ষেত্র (field) ধারণ করে এবং সেগুলোকে যোগ করতে এবং প্রদর্শন করতে সক্ষম।
Builder
class FormBuilder {
setTitle() {
throw new Error("This method should be overridden");
}
addTextInput() {
throw new Error("This method should be overridden");
}
addCheckbox() {
throw new Error("This method should be overridden");
}
getForm() {
throw new Error("This method should be overridden");
}
}
FormBuilder একটি অ্যাবস্ট্রাক্ট ক্লাস, যা ফর্ম তৈরি করার জন্য প্রয়োজনীয় মেথডগুলোর জন্য একটি ইন্টারফেস প্রদান করে।
Concrete Builder
class LoginFormBuilder extends FormBuilder {
constructor() {
super();
this.form = new Form();
}
setTitle() {
this.form.addField({ type: "title", label: "Login Form" });
}
addTextInput() {
this.form.addField({ type: "text", label: "Username" });
this.form.addField({ type: "password", label: "Password" });
}
addCheckbox() {
this.form.addField({ type: "checkbox", label: "Remember Me" });
}
getForm() {
return this.form;
}
}
LoginFormBuilderহলো কনক্রিট বিল্ডার ক্লাস, যা বিভিন্ন ধরনের ফর্ম তৈরি করতে সক্ষম।- প্রতিটি ক্লাস তাদের নিজস্ব field যুক্ত করে এবং একটি পূর্ণ ফর্ম প্রদান করে।
Client
function buildForm(builder) {
builder.setTitle();
builder.addTextInput();
builder.addCheckbox();
return builder.getForm();
}
// Create a Login Form
const loginFormBuilder = new LoginFormBuilder();
const loginForm = buildForm(loginFormBuilder);
loginForm.render();
buildForm ফাংশনটি বিল্ডার ব্যবহার করে ফর্ম তৈরি করা হয় ।
