Builder design patterni

Builder design patterni

Builder design patterni

Builder design pattern qachon ishlatiladi?

Klassdan odatda $obj = new Classname() kabi obyekt hosil qilamiz. Obyekt hosil qilishdan maqsad, shu klassning ichidagi methodlaridan foydalana olish.

Endi Klassni ichidagi ba’zi methodlardan foydalanish uchun, obyektga ba’zi bir ishlov berish kerak bo’lishi mumkin. Odatda $obj->property_name = $value; ko’rinishida propertylarga qiymat berishimiz mumkin. Lekin faqatgina qiymat berish bilan ish bitmaydi, qanaqadir propertyga ishlov berish, hisob kitob qilish kerakdir, bilmaymiz. Shunday holatda biz Builder patterndan foydalansak bo’ladi.

Buni zavodlar misolida, mashina zavod misolida tasavvur qilsak bo’ladi. Ya’ni mashina zavodda mashina, temirdan to to’liq foydalansa bo’ladigan mashina holiga kelguncha bo’ladigan jarayonlarni aytsak bo’ladi.

Mashina — obyekt;

— romga eshiklarni ilish

— balonlarni ilish

— oynalarni yopishtirish

— kapotni yopishtirish

— rulni o’rnatish

— …

bularni bajarish uchun alohida alohida robotlar mavjud. U robotlar faqat 1 ta ishni bajarishadi.

builder design patterni 65e4b26fca217

builder design patterni 65e4b27288d9f

Ya’ni, robot obyektni oladi, o’zini ishini bajaradi va bajarib bo`lib shu obyektni qaytaradi. Shunda, zavodda bitta tugma bor, mashina ishlab chiqarish uchun «Make Car» degan. Shu tugmani bossa, mashinani romi keltiriladi va unga har bir robot o’zining qilishi kerak bo’lgan ishlarni qilib, keyingisiga shu moshinani uzatadi. Bu pattern dasturlashda juda ko’p qo’llaniladi. Siz shu paytgacha kod yozib o’zingiz bilmagan holda bu patterndan foydalangan bo’lishingiz ham mumkin.

Masalan, Yii dasturchilar misolida tushuntirsam. Query Builder

klassi bor eslasangiz, Query Yoki ActiveQuery. Manashu klasslarda Builder patterni qo’llanilgan:

$rows = (new yiidbQuery())
 ->select(['id', 'email'])
 ->from('user')
 ->where(['last_name' => 'Smith'])
 ->limit(10)
 ->all();

Endi yuqoridagi Query klasini ichidagi funksiyalarga e`tiborimizni qaratamiz:

public function select($columns, $option = null)
{
    $this->select = $this->normalizeSelect($columns);
    $this->selectOption = $option;
    return $this;
}

public function from($tables)
{
    if ($tables instanceof ExpressionInterface) {
        $tables = [$tables];
    }
    if (is_string($tables)) {
        $tables = preg_split('/s*,s*/', trim($tables), -1, PREG_SPLIT_NO_EMPTY);
    }
    $this->from = $tables;
    return $this;
}

public function where($condition, $params = [])
{
    $this->where = $condition;
    $this->addParams($params);
    return $this;
}

public function limit($limit)
{
    $this->limit = $limit;
    return $this;
} 

Esladingizmi?

Manashunaqa -> bilan funksiyalarni chaqirib keta oladigan klasslar Builder pattern yordamida qilinadi.

Yuqoridagi misolda maqsad bazadan ma’lumotlarni olish, malumotlarni keraklisini olish uchun kerkli funksiyalarni ishlatilyapti.

Yana bir misol:

Yii::$app->mailer->compose()
    ->setFrom('from@domain.com')
    ->setTo('to@domain.com')
    ->setSubject('Message subject')
    ->setTextBody('Plain text content')
    ->setHtmlBody('HTML content')
    ->send();

Biz ham shu patterndan foydalanib klas hosil qilsak bo’ladi.

Keling, kofe mashina uchun dastur tuzamiz:

class Coffee
{
    public function addCoffee()
    {
        echo "Coffee solamiz n";
        return $this;
    }
    protected  function  addHotWater()
    {
        echo "Issiq suv quyamizn";
        return $this;
    }

    protected  function addSugar()
    {
        echo "Shakar solamizn";
        return $this;
    }

    protected function addMilk()
    {
        echo "Sut qushamiz";
        return $this;
    }

    public function make()
    {
        return $this
            ->addCoffee()
            ->addHotWater()
            ->addSugar()
            ->addMilk();
    }
}

$tea = new Coffee();
$tea->make();

E’tibor qilgan bo’lsangiz, har bir funksiyada shu obyektdan foydalanilyapti va shu obyektni o’zi return qilib qaytarilyapti.

Umumiy Dasturlash
Builder design patterni