دیزاین پترن،‌ الگوی طراحی Builder

http://www.developit.ir/design-patterns
http://www.developit.ir/design-patterns

مثال در دنیای واقعی

تصور کنید در فست فود یک غذای ویژه را سفارش می‌دهید. میگویید پیشنهاد سرآشپز! و آن‌ها بدون هیچ سؤالی سفارش شما را انجام و تحویل می‌دهند. این یک مثال از simple factory بود. اما مواردی وجود دارد که برای instantiation مراحل بیشتری نیاز داریم.

مثلاً برای سفارش همبرگر چه نوع نانی را می‌خواهید؟ چه سس و یا پنیری و… در چنین مواردی builder به کمک ما می‌آید.

تعریف instantiation
به ایجاد یک نمونه از یک شئ/کلاس گفته می‌شود.

var manager = new Manager();

به بیان ساده

به شما این اماکن را می‌دهد تا ضمن جلوگیری از کثیف کردن constructor، انواع مختلفی از یک شئ را ایجاد کنید. دقیقاً منظورمان چیست؟ همه ما تابع سازنده ای مثل این نمونه را دیده ایم(یک نمونه کثیف).

public function __construct($size, $cheese = true, $pepperoni = true, $tomato = false, $lettuce = true)

همانطور که میبینید پارامتر های تابع زیاد و ممکن است تعداد آن از دست برنامه نویس خارج شود و یا اینکه ترتیب چیدمان آن را فراموش کند. همچنین ممکن است به دلیل توسعه، لیست پارمتر ها افزایش یابد. اصطلاحاً به این موضوع telescoping constructor anti-pattern میگویند.

مثال برنامه نویسی

جایگزین مناسب استفاده از الگوی builder است. در ابتدا میخواهیم همبرگر خود را درست کنیم.

class 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 همبرگر را می‌نویسیم.

class 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);
    }
}

و استفاده

$burger = (new BurgerBuilder(14))
    ->addPepperoni()
    ->addLettuce()
    ->addTomato()
    ->build();

قابلیت استفاده.

- برای حل مشکل telescopic constructor.

- هنگامی که از یک شئ انواع مختلفی ساخته می‌شود. تفاوت آن با الگوی factory ایجاد اشیاء در چندین گام/مرحله است.

مطالعه رایگان و خرید کتاب