সফটওয়্যার ডিজাইন প্যাটার্ন হচ্ছে এক ধরনের সমাধান যা বারবার বিভিন্ন সফটওয়্যার ডিজাইনের ক্ষেত্রে ব্যবহার করা যায়। যদিও এটা কোন সোর্সকোড/কম্পাইল্ড বাইনারি না। এটা মূলত কিভাবে কোন সমস্যার সমাধান কিভাবে করা যায় তার একটা বর্ননা , যা অনেক যায়গায় ব্যবহার করা যায়। ডিজাইন প্যাটার্নগুলো মূলত সফটওয়্যার/সিস্টেম ডিজাইনে প্রচলিত সমস্যাগুলো সমাধানের এক ধরনের স্বীকৃতি পদ্ধতি এবং এদেরকে ‘বেস্ট প্যাকটিস‘ বলা হয়।
এই পোস্টে মূলত পিএইচপি তে বহুল ব্যবহৃত ডিজাইন প্যাটার্ন গুলো নিয়ে আলোচনা করা হয়েচে।
ফ্যাক্টরি প্যাটার্ন
ফ্যাক্টরি প্যাটার্ন একটি বহুল ব্যবহৃত ডিজাইন প্যাটার্ন। এই প্যাটার্নে মূলত একটি ক্লাস ব্যবহারকারীর প্রয়োজনীয় অবজেক্ট তৈরি করে দেয়। নিচের ফ্যাক্টরি প্যাটার্নের একটি উদাহরণ দেওয়া হলঃ
<?php | |
class Laptop | |
{ | |
private $brand; | |
private $model; | |
public function __construct($brand, $model) | |
{ | |
$this->brand = strtoupper($make); | |
$this->model = ucfirst($model); | |
} | |
public function getMakeAndModel() | |
{ | |
return $this->model. ' by ' .$this->brand; | |
} | |
} | |
class LaptopFactory | |
{ | |
public static function create($make, $model) | |
{ | |
return new Laptop($make, $model); | |
} | |
} | |
// LaptopFactory creating Laptop object | |
$laptop = LaptopFactory::create('hp', 'spectre'); | |
var_dump($laptop->getMakeAndModel()); | |
// Output: Spectre by HP |
উপরের কোডে একটি ফ্যাক্টরি (ক্লাস) ব্যবহার করা হয়েছে ল্যাপটপ অবজেক্ট তৈরি করার জন্য। ফ্যাক্টরি প্যাটার্ন ব্যবহার করলে বেশ কিছু সুবিদা পাওয়া যায়। মনে করা যায় আপনি আপনার Laptop
ক্লাসের নাম পরিবর্তন করে Computer
করলেন, এক্ষেত্রে পুরো এপ্লিকেশনে যেসকল যায়গায় আপনি সারাসরি Laptop ক্লাস ব্যবহার করেছেন সবগুলো ক্লাসের নাম পরিবর্তন করতে হবে, কিন্তু যদি আপনি যদি ফ্যাক্টরি প্যাটার্ন ব্যবহার করেন সেক্ষেত্রে শুধুমাত্র ফ্যাক্টরি ক্লাসের ভেতরে Laptop
ক্লাসের নাম পরিবর্তন করলেই হবে। ফ্যাক্টরি প্যাটার্ন সর্বদা ব্যবহার করার প্রয়োজন পড়ে না।
ফ্যাক্টরি প্যাটার্ন এর আরেকটি পরিমার্জিত রুপ হচ্ছে ফাস্যাড প্যাটার্ন।
সিঙ্গেলটোন প্যাটার্ন
সফটওয়্যার ইঞ্জিনিয়ারিং এ সিঙ্গেলটোন প্যাটার্ন হচ্ছে এমন এক ডিজাইন প্যাটার্ন যা কোন ক্লাস থেকে একাধিক ইন্সট্যান্স তৈরি করতে বাধা দেয়, অর্থাৎ একটি ক্লাসের কেবলমাত্র একটি ইন্সট্যান্স-ই থাকবে।

সাধারণত ওয়েব অপ্লিকেশন ডিজাইন করার সময় এই ডিজাইন প্যাটার্ন ব্যবহার যুকিযুক্ত মনে হয়। নিচের সিঙ্গেলটোন প্যাটার্নের একটি উদাহরণ দেওয়া হলঃ
<?php | |
class Singleton { | |
private static $instance; | |
public static function getInstance() { | |
if (null === self::$instance) { | |
self::$instance = new self(); | |
} | |
return self::$instance; | |
} | |
/** | |
* protected to prevent creating a new instance outside of the class via the new operator. | |
*/ | |
protected function __construct() { | |
$this->name = ''; | |
} | |
/** | |
* private magic method to prevent cloning of an instance of the class via the clone operator. | |
*/ | |
private function __clone() {} | |
/** | |
* private magic method to prevent unserializing of an instance of the class via the global functionunserialize(). | |
*/ | |
private function __wakeup() {} | |
public function setName($name) { | |
$this->name = $name; | |
} | |
public function showName() { | |
return $this->name; | |
} | |
} | |
/** | |
* Child Class of Singleton Which extends Singleton Class | |
*/ | |
class SingletonChild extends Singleton { | |
} | |
/** | |
* Example | |
*/ | |
// Creating Instance From Singleton Class | |
$singleton = Singleton::getInstance(); | |
$singleton->setName('Saiful'); | |
var_dump($singleton->showName()); | |
// Creating Instance From SingletonChild Class | |
$child = SingletonChild::getInstance(); | |
var_dump($child->showName()); |
উপরের কোডে সিঙ্গেলটোন প্যাটার্ন ইমপ্লিমেন্ট করে দেখানো হয়েছে। স্টাটিক getInstance()
মেথড দিয়ে Singleton
ক্লাসের ইন্সট্যান্স তৈরি করা হয়েছে। Singleton
ক্লাসে setName()
, showName()
নামের দুইটি মেথড আছে। উপরের কোডের শেষের অংশে SingletonChild
নামে একটি ক্লাস লেখা হয়েছে যা Singleton
ক্লাসকে এক্সটেন্ড করে। উদাহরণের কোডে দেখতে পাবেন $singleton
এ Singleton
এর ইন্সট্যান্স রাখা হয়েছে। এরপর setName()
মেথড দিয়ে name
অবজেক্টে 'Saiful'
সেট করা হয়েছে এবং showName()
মেথড দিয়ে name
অবজেক্টের ভ্যালু দেখানো হয়েছে। এরপর $child এ SingletonChild ইন্সট্যান্স কল করা হয়েছে, যা মূলত পূর্বে তৈরিকৃত Singleton
ক্লাসের ইন্সট্যান্স রিটার্ন করেছে, যে কারনে ( $child->showName();
) setName()
মেথড কল করায় পুর্বে সংরক্ষিত name
অবজেক্টের ভ্যালু দেখিয়েছে, অর্থাৎ নতুন ইন্সট্যান্স তৈরি হয়ন
…চলবে