আপডেট:
রিফাত ভাইয়ের সাজেশন অনুসারে দুটো জিনিস যোগ করলাম –
# namespace এর ব্যবহার
# instanceof ব্যাবহার করে নিশ্চিত হওয়া যে রিকোয়েস্ট করা ক্লাস আসলে মিডিয়া ইন্টারফেইস ইম্প্লিমেন্ট করে ।
এমরান ভাইয়ের পরামর্শ অনুসারে ডিজাইন বাই কন্ট্র্যাক্ট এর রেফারেন্স যোগ করলাম ।
ফ্যাক্টরি মেথড প্যাটার্ন এর কাজ তার নাম থেকেই সহজে অনুমান করা যায় । এই প্যাটার্নে একটি ফ্যাক্টরি অবজেক্ট এ একটি মেথড থাকে যার কাজ হচ্ছে আমাদের প্রয়োজনমত অবজেক্ট তৈরি করে দেওয়া । এই অবজেক্টগুলো সাধারণত একই ধরণের হয়ে থাকে । উদাহরণ হিসেবে আমরা ভাবতে পারি একটি কন্টেন্ট ম্যানেজমেন্ট সলিউশন এর কথা (যেমন: ওয়ার্ডপ্রেস, জুমলা কিংবা দ্রুপাল) যেখানে নানা ধরণের কন্টেন্ট থাকে । থাকতে পারে অডিও, ভিডিও কিংবা ফটো । এগুলোকে এক সাথে আমরা মিডিয়া হিসেবে চিন্তা করতে পারি । আবার দেখুন, এই মিডিয়াগুলোর কিছু সাধারণ বৈশিষ্ট্য থাকতে পারে, যেমন: সব মিডিয়ারই একটি পাবলিক URL থাকে, সার্ভারে লোকেশন বোঝানোর জন্য ফাইল পাথ থাকে, মিডিয়ার ফাইল সাইজ থাকে, সেই সাথে থাকে কোনটি কোন টাইপের মিডিয়া । এরকম ক্ষেত্রে আমরা একটি মিডিয়া ইন্টারফেইস তৈরি করে নিবো এবং আমাদের স্বতন্ত্র মিডিয়াগুলো এই ইন্টারফেইস ইম্প্লিমেন্ট করবে । ইন্টারফেইস ব্যবহার করে আমরা অবজেক্টগুলোর সাধারণ আচরণ নির্দিষ্ট করে দিতে পারি । যেমন আমরা সব গুলো অবজেক্টকে বাধ্য করতে পারি একটি getType() মেথড ইম্প্লিমেন্ট করতে যেটা আমাদের বলে দিবে ঐ অবজেক্টটি কোন টাইপের মিডিয়া । ইন্টারফেইসের মাধ্যমে ফরমাল একটি স্ট্রাকচার দাড় করানোর কনসেপ্টটি ডিজাইন বাই কন্ট্র্যাক্ট হিসেবে পরিচিত ।
এরপর আমরা একটি মিডিয়া ফ্যাক্টরি ক্লাস ডিজাইন করবো যার একটি স্ট্যাটিক মেথড থাকবে factory() নামে । এই মেথডে আমরা টাইপ পাস করে দিলে সে আমাদের ঐ টাইপের অবজেক্ট দিবে । স্ট্যাটিক মেথড ব্যবহার করবো যাতে নতুন অবজেক্ট তৈরি করার জন্য ফ্যাক্টরি অবজেক্ট এর কোন ইনস্ট্যান্স তৈরি করা না লাগে । আমরা যাতে সরাসরি MediaFactory::factory() কল করতে পারি সেজন্যই স্ট্যাটিক মেথড ।
আমরা এখন খুব সাধারণ একটি উদাহরণ দেখবো পিএইচপি তে –
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?php /** * Author: Abu Ashraf Masnun * URL: http://masnun.me */ namespace DesignPatternExample; class MediaFactory { public static function factory($type) { $className = __NAMESPACE__ . '\\' . ucfirst($type); if (!class_exists($className)) { throw new \Exception('Class does not exist!'); } $object = new $className(); if ($object instanceof Media) { return $object; } else { throw new \Exception("The requested type is not a valid media type!"); } } } interface Media { public function getType(); } class Video implements Media { public function getType() { return "Video"; } } class Audio implements Media { public function getType() { return "Audio"; } } class Photo implements Media { public function getType() { return "Photo"; } } |
এখানে দেখুন, আমাদের একটি Media ইন্টারফেইস আছে যেটি একটি পাবলিক মেথড ডিফাইন করেছে getType() । আমাদের Audio, Video এবং Photo ক্লাস এই ইন্টারফেইসকে ইম্প্লিমেন্ট করেছে নিজের মত করে । MediaFactory ক্লাসের factory() আমাদের কাছে $type প্যারামিটার চায় । টাইপ বলে দিলে সে সেই টাইপের অবজেক্ট তৈরি করে রিটার্ন করে ।
এবার আমরা দেখি কিভাবে আমাদের কোডে এই ফ্যাক্টরি মেথড প্যাটার্ন ব্যবহার করবো –
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php /** * Author: Abu Ashraf Masnun * URL: http://masnun.me */ /// Put some class autoloading or require the other files manually here use DesignPatternExample\MediaFactory; $audio = MediaFactory::factory('audio'); var_dump($audio->getType()); $video = MediaFactory::factory('video'); var_dump($video->getType()); $photo = MediaFactory::factory('photo'); var_dump($photo->getType()); |
এখানে আমরা প্রতিবার MediaFactory এর কাছ থেকে আমাদের প্রয়োজনীয় টাইপের অবজেক্ট চেয়ে নিচ্ছি । এই কোডের আউটপুটটা কেমন হবে? আসুন দেখে নেই –
|
1 2 3 4 5 |
Lighthouse: ~/Codes/php → php test.php string(5) "Audio" string(5) "Video" string(5) "Photo" |
তো, এটাই হলো ফ্যাক্টরি প্যাটার্ন যেখানে একটি ফ্যাক্টরি মেথড আমাদের ফরমায়েশ মত অবজেক্ট তৈরি করে দেয় 🙂