ফ্যাক্টরী
ফ্যাক্ট রী প্যাটার্ন এমন একটি প্যাটার্ন যা কম বেশি সব ধরনের অ্যাপ্লিকেশনে ব্যাবহৃত হয়ে থাকে এইটা ক্রিয়েশনাল প্যাটার্ন ক্যাটাগরীর মধ্যে পরে।
ফ্যাক্টরী প্যাটার্নের মূল উদ্দেশ্যই হল এর প্রোডাক্ট কিংবা চাইল্ড ক্লাসের অবজেক্ট তৈরি করে দেয়া। যেমন বাস্তব জীবনে যেভাবে ফ্যাক্টরীতে প্রোডাক্ট তৈরি হয়ে থাকে।
এই প্যাটার্ন ক্লাইন্টের কাছে অবজেক্ট ইনস্টানশিয়েট করার লজিক অদৃশ্যমান রাখে। আর অবজেক্টের ক্লাস গুলা একটা কমন ইন্টারফেইস কে ফলো করে বানানো থাকে।
এই প্যাটার্ন সাধারণত ৩ প্রকারেরঃ ১. সিম্পল ফ্যাক্টরী। ২. ফ্যাক্টরী মেথড। ৩. অ্যাবস্ট্রাক্ট ফ্যাক্টরী।
ফ্যাক্টরী প্যাটার্নের মধ্যে সিম্পল ফ্যাক্টরী হচ্ছে সবচেয়ে সহজ প্যাটার্ন যদিও অফিশিয়ালি এই প্যাটার্ন ডিজাইন প্যাটার্ন হিসেবে স্বীকৃত না।
এই প্যাটার্নের নিয়ম মতে এর একটি ফ্যাক্টরী থাকবে আর একটি ফ্যাক্টরী একই সময় শুধুমাত্র একটাই প্রোডাক্ট তৈরি করবে অর্থাৎ একটিই ইনস্টান্স কিংবা অবজেক্ট রিটার্ন করবে।
নিচে একটা উদাহরণ দেয়া হলঃ
class CarFactory
{
protected $brands = [];
public function __construct()
{
$this->brands = [
'mercedes' => 'MercedesCar',
'toyota' => 'ToyotaCar',
];
}
public function make($brand)
{
if (!array_key_exists($brand, $this->brands)) {
return new Exception('Not available this car');
}
$className = $this->brands[$brand];
return new $className();
}
}
interface CarInterface
{
public function design();
public function assemble();
public function paint();
}
class MercedesCar implements CarInterface
{
public function design()
{
return 'Designing Mercedes Car';
}
public function assemble()
{
return 'Assembling Mercedes Car';
}
public function paint()
{
return 'Painting Mercedes Car';
}
}
class ToyotaCar implements CarInterface
{
public function design()
{
return 'Designing Toyota Car';
}
public function assemble()
{
return 'Assembling Toyota Car';
}
public function paint()
{
return 'Painting Toyota Car';
}
}
$carFactory = new CarFactory;
$mercedes = $carFactory->make('mercedes');
echo $mercedes->design() . '<br/>';
echo $mercedes->assemble() . '<br/>';
echo $mercedes->paint() . '<br/>';
echo '<br/>';
$toyota = $carFactory->make('toyota');
echo $toyota->design() . '<br/>';
echo $toyota->assemble() . '<br/>';
echo $toyota->paint() . '<br/>';
এখানে
CarFactory
নামে মূল ফ্যাক্টরী ক্লাস ডিফাইন করা হয়েছে যেটির মাধ্যমে একটা Car
ইনস্টান্স তৈরি করা হবে। Car
এর জন্য ২ টি ক্লাস যথাক্রমে MercedesCar
ও ToyotaCar
ডিফাইন করা হয়েছে যেগুলো CarInterface
কে ফলো করেছে।এবার চলুন
CarFactory
ক্লাসটিকে ইনস্টানশিয়েট করি।$carFactory = new CarFactory;
এরপর ধরুন
MercedesCar
ক্লাসকে ফ্যাক্টরির মাধ্যমে ইনস্টানশিয়েট করব তাহলে টাইপ/প্যারামিটার হিসেবে mercedes
দিতে হবে নিচের মত করে।$mercedes = $carFactory->make('mercedes');
echo $mercedes->design() . '<br/>';
echo $mercedes->assemble() . '<br/>';
echo $mercedes->paint() . '<br/>';
অনুরূপ ভাবে
ToyotaCar
ক্লাসকে ইনস্টানশিয়েট করতে হলে$toyota = $carFactory->make('toyota');
echo $toyota->design() . '<br/>';
echo $toyota->assemble() . '<br/>';
echo $toyota->paint() . ‘<br/>';
আর ডিফাইন না করা কোন ক্লাসের টাইপ দিলে সেটি এরর দেখাবে।
ফ্যাক্টরী মেথড প্যাটার্ন অনেকখানি সিম্পল ফ্যাক্টরী প্যাটার্নের মতই শুধুমাত্র এর মূল পার্থক্য হল এটি তার সাব ক্লাস গুলোকে ক্লাস ইনস্টানশিয়েট করার স্বাধীনতা দিয়ে দেয়। আর এর একাধিক ফ্যাক্টরী থাকতে পারে।
নিচে একটা উদাহরণ দেয়া হলঃ
abstract class VehicleFactoryMethod
{
abstract public function make($brand);
}
class CarFactory extends VehicleFactoryMethod
{
public function make($brand)
{
$car = null;
switch ($brand) {
case "mercedes":
$car = new MercedesCar;
break;
case "toyota":
$car = new ToyotaCar;
break;
}
return $car;
}
}
class BikeFactory extends VehicleFactoryMethod
{
public function make($brand)
{
$bike = null;
switch ($brand) {
case "yamaha":
$bike = new YamahaBike;
break;
case "ducati":
$bike = new DucatiBike;
break;
}
return $bike;
}
}
interface CarInterface
{
public function design();
public function assemble();
public function paint();
}