دیزاین پترن، الگوی طراحی Builder
مثال در دنیای واقعی
تصور کنید در فست فود یک غذای ویژه را سفارش میدهید. میگویید پیشنهاد سرآشپز! و آنها بدون هیچ سؤالی سفارش شما را انجام و تحویل میدهند. این یک مثال از simple factory بود. اما مواردی وجود دارد که برای instantiation مراحل بیشتری نیاز داریم.
مثلاً برای سفارش همبرگر چه نوع نانی را میخواهید؟ چه سس و یا پنیری و… در چنین مواردی builder به کمک ما میآید.
تعریف instantiation
به ایجاد یک نمونه از یک شئ/کلاس گفته میشود.
1var manager = new Manager();
به بیان ساده
به شما این اماکن را میدهد تا ضمن جلوگیری از کثیف کردن constructor، انواع مختلفی از یک شئ را ایجاد کنید. دقیقاً منظورمان چیست؟ همه ما تابع سازنده ای مثل این نمونه را دیده ایم(یک نمونه کثیف).
1public function __construct($size, $cheese = true, $pepperoni = true, $tomato = false, $lettuce = true)
همانطور که میبینید پارامتر های تابع زیاد و ممکن است تعداد آن از دست برنامه نویس خارج شود و یا اینکه ترتیب چیدمان آن را فراموش کند. همچنین ممکن است به دلیل توسعه، لیست پارمتر ها افزایش یابد. اصطلاحاً به این موضوع telescoping constructor anti-pattern میگویند.
مثال برنامه نویسی
جایگزین مناسب استفاده از الگوی builder است. در ابتدا میخواهیم همبرگر خود را درست کنیم.
123456789101112131415161718class Burger { protected $size; protected $cheese = false; protected $pepperoni = false; protected $lettuce = false; protected $tomato = false; protected $tomato = false; public function __construct(BurgerBuilder $builder) { $this->size = $builder->size; $this->cheese = $builder->cheese; $this->pepperoni = $builder->pepperoni; $this->lettuce = $builder->lettuce; $this->tomato = $builder->tomato; } }
و سپس builder همبرگر را مینویسیم.
123456789101112131415161718192021222324252627282930313233343536373839404142class BurgerBuilder { public $size; public $cheese = false; public $pepperoni = false; public $lettuce = false; public $tomato = false; public function __construct(int $size) { $this->size = $size; } public function addPepperoni() { $this->pepperoni = true; return $this; } public function addLettuce() { $this->lettuce = true; return $this; } public function addCheese() { $this->cheese = true; return $this; } public function addTomato() { $this->tomato = true; return $this; } public function build(): Burger { return new Burger($this); } }
و استفاده
12345$burger = (new BurgerBuilder(14)) ->addPepperoni() ->addLettuce() ->addTomato() ->build();
قابلیت استفاده.
– برای حل مشکل telescopic constructor.
– هنگامی که از یک شئ انواع مختلفی ساخته میشود. تفاوت آن با الگوی factory ایجاد اشیاء در چندین گام/مرحله است.