Factory Pattern


ارسال در تاریخ ۲۲ بهمن,۱۳۹۵



در این بخش ما می خواهیم در مورد ایجاد اشیا توسط الگوی طراحی factory صحبت کنیم. اغلب ما می خواهیم بصورت کامل با انواع مختلف اشیا در راه های یکسان تعامل برقرار کنیم. یک مثال قوی اتصال به دیتابیس می باشد. ما می خواهیم قابلیت اتصال به دیتابیس را بدون در نظر گرفتن اینکه MySQL، Oracle یا SQL server باشد توسط روش یکسانی داشته باشیم. این ممکن است کمی مشکل باشد، زیرا ایجاد Object های مختلف ممکن است متفاوت باشد. ما به راهی نیاز داریم که جزئیات پیاده سازی ایجاد اشیا را مخفی کنیم و به ما اجازه بدهد تا شی مورد نظر را بسازیم که این دقیقا کاری است که الگوی طراحی factory برای ما انجام می دهد. این الگو اغلب توسط الگوهای دیگر استفاده می شود، جایی که می خواهید با اشیا مختلف دقیقا توسط یک راه یکسان تعامل برقرار کنید.

استفاده از الگوی طراحی factory هنگامی که می خواهیم رابط ها را استاندارد تعریف کنیم بسیار مفید است. به عنوان مثال هنگامی که می خواهید از اتصالات دیتابیس مختلف استفاده کنید، ما باید منطق های جدایی برای MySQL، دیگری برای Oracle و دیگری برای SQL Server داشته باشیم. اما هنگامی که کد شما پیچیده می شود، این بصورت کامل محو می شود که از کدامیک استفاده می کنید.

در مثال زیر چند کلاس داریم که از یک کلاس پایه ارث برده اند. در هر دو حالت ما می توانیم با اشیا دقیقا در یک راه یکسان تعامل برقرار کنیم.

include_once 'vehicle.php';

$car = new Car(4);
echo $car->getType();

echo '<br>';

$truck = new Truck(18);
echo $truck->getType();

ابتدا ما یک شی Car و سپس یک شی truck داریم و این ها در فایل vehicle.php تعریف شده اند.

class Vehicle{
	public function __construct($wheels=0){
		$this->wheels = $wheels;
	}

	public function getType(){
		return get_class($this);
	}
}

class Car extends Vehicle{}
class Truck extends Vehicle{}

خب در هر دو حالت ما یک car داریم که از vehicle ارث برده است و یک truck که از vehicle ارث برده است و در constructor تعداد چرخ ها یا wheels را دریافت می کنیم. مشکلی که در اینجا پیش می آید، زمانی است که می خواهیم constructor را برای هر کدام از این اشیا ویرایش کنیم. اگر بخواهیم که این کار را انجام دهیم باید constructor را برای تمام این کلاس ها آپدیت کنیم. در اینجا ما تنها دو کلاس داریم که اهمیت زیادی ندارد. اما اگر تعداد کلاس ها زیاد باشد می تواند زیبایی کار را به سرعت پیچیده کند.

حالا ما می خواهیم که یک factory کوچک راه اندازی کنیم. کد زیر را ببینید که تغییر زیادی هم نداشته است.

include_once 'vehicle.php';

$car = vehicle::create('car',4);
echo $car->getType();

echo '<br>';

$truck = vehicle::create('truck',4);
echo $truck->getType();

اما اجازه بدهید ابتدا کلاس Vehicle را ببینیم.

class Vehicle{
	public static function create($type, $wheels){
		switch ($type) {
			case 'car':
				return new Car($wheels);
				break;			
			case 'truck':
				return new Truck($wheels);
				break;				
			default:
				return new stdClass();
		}
	}

	public function getType(){
		return get_class($this);
	}
}

class Car extends Vehicle{}
class Truck extends Vehicle{}

در این کلاس یک متد با نام create ایجاد کرده ایم که دو پارامتر می گیرد، یکی type یا نوع، و دیگری تعداد چرخ ها یا wheels و ما از آن ها استفاده می کنیم تا کلاس که می خواهیم را ایجاد کنیم. حالا ما می توانیم constructor های مختلفی داشته باشیم.


برای ارسال نظر لطفا وارد شوید.