الگوی طراحی فکتوری نیز در دسته بندی Creational قرار دارد. در این مقاله به بررسی مسئله و حل و پیاده سازی آن با این الگوی طراحی میپردازیم.
افراد متخصص در حوزه برنامه نویسی معتقد هستند که دستور new، دستوری خطرناک و پر هزینه است و باید برای حل این مشکل از این دیزاین پترن استفاده کرد.
بطور مثال، یک کلاس یوزر داریم که میخواهیم در جاها و فایل های مختلف(حدود 50 تا فایل) از آن استفاده کنیم، هی مجبوریم new user کرده تا به تابع isLogin دسترسی داشته باشیم. حال این فقط واسه یک کلاس است و اگر تغییری در نام کلاس یا constractor آن داده شود، شما و پروژه اتون رو درگیر میکند. برای حل مسئله و جلوگیری از تکرار کلید واژه new کافی است از الگوی فکتوری استفاده شود.
البته باید درنظر داشت که این الگو، سه حالت دارد:simple factory، factory methodو static factory.
سیمپل فکتوری همانطور که از اسمش مشخص است میگوید یک کارخانه بسازید و تولید و ساخت Object ها را به آن بسپار و شی را از آن دریافت کن. بدین صورت استفاده از کلید واژه new به حداقل میرسد.
پیاده سازی آن به صورت زیر است.
فرض کنید سه تا کلاس داریم مربوط به ساخت ماشین های سنگین، اسپرت و شاسی بلند که کلاس ماشین را توسعه دادند. حال چگونه از این سه کلاس بدون استفاده زیادی از کلیدواژه new استفاده کنیم؟
class Car { } class Car_SUV extends Car{ } class Car_Sedan extends Car{ } class Car_truck extends Car{ } // ببینید برای فراخوانی هر کلاس چند تا نیو داریم. پس خوبه از فکتوری استفاده کنیم $truckObj= new Car_truck (); $suvObj= new Car_SUV (); $SedanObj= new Car_Sedan (); $carObj= new Car (); // using carFactory implemention class CarFactory{ public static function build($type) { switch($type){ case 'SUV': return new Car_SUV (); breake; case 'Sedan': return new Car_Sedan (); breake; case 'truck': return new Car_truck (); breake; default : return new Car(); breake; } } $truckObj= CarFactory::build('truck'); $suvObj= CarFactory::build('SUV'); $SedanObj= CarFactory::build('sedan'); $carObj= CarFactory::build('car'); }
راه های پیاده سازی متفاوتی وجود دارد، برای همین مثال. در ادامه به یکی دیگر از آنها میپردازیم.
<?php class Car{ private $vehicleMake; private $vehicleModel; public function __construct($make, $model) { $this->vehicleMake = $make; $this->vehicleModel = $model; } public function getMakeAndModel(){ return $this->vehicleMake . ' ' . $this->vehicleModel; } }
class CarFactory { public static function create($make, $model) { return new Car($make, $model); } } // have the factory create the car object // متد استاتیک رو با دو پارامتر صدا میزند. بعد برند با مدل به کانستراکتور ماشین ارسال میشود $veyron = CarFactory::create('Bugatti', 'Veyron'); // در اینجا مدل و برند داده شده ساخته میشود و برگردانده میشود برای چاپ print_r($veyron->getMakeAndModel()); // outputs "Bugatti Veyron"
یکی دیگر از مزایای استفاده از این الگوی طراحی این است که اگر نام مدلی قرار باشد تغییر کند، فقط در فکتوری تغییر میکند و نیاز به جستجوی زیادی نیست.
این مقاله فقط به simple factory پرداخته است و منبع آن اینترنت و البته دوره مجازی سون لرن است.
دیزاین پترن آداپتور موضوع مقاله بعدی میباشد.