آموزش دیزاین پترن Builder Design Pattern

  • خانه
  • آموزش دیزاین پترن Builder Design Pattern
Image تحقیقات

آموزش دیزاین پترن Builder Design Pattern

سلام خدمت شما دوستان

دیزاین پترن Builder یکی دیگر از آموزش دیزاین پترن های creational یا تولیدی است به این معنی که  هدف ایجاد آن آبجکت هایی می باشد  دقیقا مانند مابقی دیزاین پترن های دسته بندی creational . (مانند singleton , multiton , factory)

دیزاین پترن Builder نقش یک سازنده است عمل می کند یعنی مراحل ساخت یک آبجکت را به صورت مرحله به مرحله و با استفاده از یک ترتیب مشخص انجام می دهد .این روند ساخت توسط یک کلاس به نام Director مدیریت  و نظارت می شود . در واقع این کلاس است که نحوه ساخت آبجکت های دیگر را کنترل می کند و متدهای داخل آن ها را به ترتیب صدا زده و اجرا می کند .

مثالی که میشه زد مثلا در یک سیستم فست بود.مراحل درست کردن ساندویج ها تقریبا شبیه هم است مثلا برای درست کردن ساندویج همبرگر  :

  1. ابتدا همبرگر سرخ می شود .
  2. سپس همبرگر وارد نان می شود .
  3. مخلفاتی مانند گوجه و خیارشور و … اضافه می شود .
  4. یک نوشابه در کنار ساندویج قرار داده می شود به به مشتری عرضه خواهد شد .

تقریبا مراحل ساخت ساندویج های سوسیس و فلافل هم به این صورت است . پس ما یه سری کلاس هایی داریم که متدهای مشترکی دارند و باید به ترتیب اجرا شوند .

خب حالا مثال پایین رو مشاهده کنید .

در این مثال 4 کلاس اصلی داریم که متدهای مشترکی دارن (در واقع مثل همان کلاس های ساخت همبرگر و فلافل و .. به اصطلاح بهشون product میگیم.)

  • EmployedMaleBuilder
  • UnemployedMaleBuilder
  • EmployedFemaleBuilder
  • UnemployedFemaleBuilder

یک کلاس به اسم PersonDirector داریم که وظیفه اجرای متدهای مختلف یک کلاس خاص به ترتیب را دارد .

<?php
/**
 * An extremely basic class for creating people objects
 */
class Person
{
    public $employed;
 
    public $gender;
 
    const GENDER_MALE   = "Male";
 
    const GENDER_FEMALE = "Female";
 
}
 
/**
 * All people builder should implement this interface
 */
interface PersonBuilderInterface
{
    public function setGender();
    public function setEmployed();
    public function getResult();
}
 
/**
 * builder to create an employed male
 */
class EmployedMaleBuilder implements PersonBuilderInterface
{
    private $person;
 
    public function __construct()
    {
        $this->person = new Person();
    }
 
    public function setGender()
    {
        $this->person->gender = Person::GENDER_MALE;
    }
 
    public function setEmployed()
    {
        $this->person->employed = true;
    }
 
    public function getResult()
    {
        return $this->person;
    }
}
 
/**
 * builder to create an unemployed male
 */
class UnemployedMaleBuilder implements PersonBuilderInterface
{
    private $person;
 
    public function __construct()
    {
        $this->person = new Person();
    }
 
 
    public function setGender()
    {
        $this->person->gender = Person::GENDER_MALE;
    }
 
    public function setEmployed()
    {
        $this->person->employed = false;
    }
 
    public function getResult()
    {
        return $this->person;
    }
}
 
/**
 * builder to create an employed female
 */
class EmployedFemaleBuilder implements PersonBuilderInterface
{
    private $person;
 
    public function __construct()
    {
        $this->person = new Person();
    }
 
    public function setGender()
    {
        $this->person->gender = Person::GENDER_FEMALE;
    }
 
    public function setEmployed()
    {
        $this->person->employed = true;
    }
 
    public function getResult()
    {
        return $this->person;
    }
}
 
/**
 * builder to create an unemployed female
 */
class UnemployedFemaleBuilder implements PersonBuilderInterface
{
    private $person;
 
    public function __construct()
    {
        $this->person = new Person();
    }
 
    public function setGender()
    {
        $this->person->gender = Person::GENDER_FEMALE;
    }
 
    public function setEmployed()
    {
        $this->person->employed = false;
    }
 
    public function getResult()
    {
        return $this->person;
    }
}
 
/**
 * The director class is part of the builder patter, the build method should be passed a builder.
 * The build method should than call all of the builder methods and return a Person object
 */
class PersonDirector
{
    public function build(PersonBuilderInterface $builder)
    {
        $builder->setGender();
        $builder->setEmployed();
 
        return $builder->getResult();
    }
}
 
$director                = new PersonDirector();
$employedMaleBuilder     = new EmployedMaleBuilder();
$unemployedMaleBuilder   = new UnemployedMaleBuilder();
$employedFemaleBuilder   = new EmployedFemaleBuilder();
$unemployedFemaleBuilder = new UnemployedFemaleBuilder();
 
/**
 * object(Person)#3 (2) {
 * (
 *   ["employed"] => bool(true)
 *   ["gender"] => string(4) "Male"
 * )
 */
$employedMale     = $director->build($employedMaleBuilder);
 
/**
 * object(Person)#5 (2) {
 * (
 *   ["employed"] => bool(false)
 *   ["gender"] => string(4) "Male"
 * )
 */
$unemployedMale   = $director->build($unemployedMaleBuilder);
 
/**
 * object(Person)#7 (2) {
 * (
 *   ["employed"] => bool(true)
 *   ["gender"] => string(4) "Female"
 * )
 */
$employedFemale   = $director->build($employedFemaleBuilder);
 
/**
 * object(Person)#11 (2) {
 * (
 *   ["employed"] => bool(false)
 *   ["gender"] => string(4) "Female"
 * )
 */
$unemployedFemale = $director->build($unemployedFemaleBuilder);

 

قاعده های دیزاین پترن builder

  • هر builder ای (منظور همان کلاس های  EmployedMaleBuilder و UnemployedMaleBuilder و …) که ایجاد می کنید باید متدهای مختلفی داشته باشند و هر متد آن فقط یه قسمتی از کد یا کانفیگ ما را انجام دهد .
  • هر builder ای (منظور همان کلاس های  EmployedMaleBuilder و UnemployedMaleBuilder و …) که ایجاد می کنید باید از اینترفیس مورد نظر implement شود .
  • هر builder ای (منظور همان کلاس های  EmployedMaleBuilder و UnemployedMaleBuilder و …) که ایجاد می کنید باید یک متد () getResult داشته باشد و تمام آبجکت آماده شده را بازگرداند .
  • به جای اینکه متدهای داخل builder ها را خودمان مستقیم صدا بزنیم باید شی builder را ایجاد کنی و آن را به کلاس director خودمان پاس دهیم تا متدها داخل آن صدا زده شود .
  • هر کلاس کلاس director باید یک متد build داشته باشد تا متدهای داخل کلاس های builder (منظور همان کلاس های  EmployedMaleBuilder و UnemployedMaleBuilder و …) را صدا بزند