Design Pattern Php Là Gì

Trong bài baohiemlienviet.comết trước, bọn họ đã thuộc nhau tìm hiểu về Abstract Factory Pattern. Trong nội dung bài baohiemlienviet.comết này, chúng ta sẽ tiếp tục khám phá một kiến thiết pattern khác cũng thuộc nhóm khởi chế tạo ra (creational patterns) mang tên “Builder Pattern”.

Bạn đang xem: Design pattern php là gì


Builder Pattern là gì thế?

Builder Pattern là một trong design pattern thuộc team khởi chế tác (creational patterns). Nó được được xây dựng nhằm mục đích khắc phục một trong những nhược điểm còn tồn đọng của Factory Pattern và Abstract Factory Pattern.

Khi đối tượng có nhiều thuộc tính, vẫn có một vài vấn đề bao gồm với Factory Pattern và Abstract Factory Pattern:

quá các tham số đề xuất truyền vào tự phía client cho tới Factory class.Một số tham số hoàn toàn có thể là tùy chọn nhưng lại trong Factory Pattern, chúng ta phải gửi toàn bộ tham số, với tham số tùy chọn nếu ko nhập gì thì đã truyền là null.

Chúng ta có thể giải quyết những vấn đề nêu trên bằng phương pháp cung cung cấp một hàm khởi chế tác với đông đảo tham số nên và các phương thức getter/ setter để setup các thông số tùy chọn. Tuy nhiên, hướng tiếp cận này sẽ làm cho trạng thái của đối tượng người dùng trở yêu cầu không duy nhất quán tính đến khi tất cả các thuộc tính của nó được thiết lập một bí quyết rõ ràng.

Xuất vạc từ lý do đó, builder pattern đã làm được ra đời. Nó giải quyết và xử lý vấn đề bên trên này bằng baohiemlienviet.comệc cung cấp một cách xây dựng đối tượng người tiêu dùng từng bước một và cung ứng một cách thức để trả về đối tượng người sử dụng cuối cùng.

Builder Pattern là gì và cách áp dụng trong PHP?

Cấu trúc

Builder Pattern bao gồm năm yếu tố cơ bản là: Builder, Concrete Builder, Product, Director với Client.

*

Trong đó:

Builder: Là thành phần có mang một lớp trừu tượng (abstract class) để tạo thành một hoặc đa số của đối tượng Product.Concrete Builder: Là yếu tắc triển khai, cụ thể hóa những lớp trừu tượng mang lại để tạo thành các thành phần cùng tập hợp những thành phần đó với nhau. Thành phần này sẽ xác minh và nỗ lực giữ các thể hiện mà lại nó chế tác ra. Đồng thời nó cũng hỗ trợ phương thức để trả các các thể hiện mà nó đã tạo nên trước đó.Product: Là nguyên tố sẽ thay mặt đại diện cho các đối tượng người tiêu dùng phức tạp phải tạo lập ra.Director: Là thành phần sẽ khởi tạo đối tượng Builder (Có thể tất cả hoặc không).Client: Là thành phần sẽ sử dụng những ConcreteBuilder với Director.

Nên thực hiện Builder Pattern lúc nào?

Dưới đây là một số ngôi trường hợp bạn nên suy nghĩ sử dụng builder pattern mang lại code của mình:

Các class của chúng ta chứa rất nhiều hàm khởi chế tạo ra hoặc đông đảo hàm khởi sinh sản quá kềnh càng và phức tạp.Bạn không thích baohiemlienviet.comệc gán giá chỉ trị cho những tham số của hàm khởi tạo phải tuân theo một lẻ loi tự thế định như thế nào đó, ví dụ: cố vì cần gán quý giá tuần tự từ thông số A rồi bắt đầu đến thông số B và tham số C, chúng ta có thể gán giá bán trị cho tham số B trước rồi mới đến A và C.

Xem thêm: Công Ty Vàng Bạc Đá Quý Sinh Diễn Hôm Nay Mới Nhất # Top Like

Vấn đề để ra

Giả sử các bạn là thành baohiemlienviet.comên trong lực lượng kỹ sư phân phát triển ứng dụng cho bank XYZ. Vì chưng là hệ thống của ngân hàng nên tài khoản bank (bank account) là một trong những khía cạnh mà chúng ta không thể không thao tác đến. Dưới đấy là cách các bạn xây dựng class BankAccount cho hệ thống phần mềm của bank này vào phần đa ngày đầu:

public class BankAccount private $accountNumber; private $owner; private $balance; public function __construct($accountNumber, $owner, $balance) $this->accountNumber = $accountNumber; $this->owner = $owner; $this->balance = $balance; Không quá nặng nề để gọi được đoạn code trên đúng không ạ nào? nhờ vào đoạn code trên, để tạo ra một tài khoản mới, tất cả những gì bạn phải làm chỉ đơn giản là:

$account = new BankAccount(123, "Bart", 100);Tuy nhiên, không lâu sau đó bạn cảm nhận một yêu thương cầu mới từ sếp đề nghị bổ sung cập nhật thêm mức lãi suất vay hàng tháng đến từng tài khoản, ngày mở tài khoản và trụ sở mở thông tin tài khoản (tùy chọn). Sau khoản thời gian đọc chấm dứt yêu cầu new này của sếp, bạn bĩu môi cùng thầm nghĩ trong đầu “Tưởng chuyện gì to lớn tát, dăm ba cái lặt vặt này sửa tí là xong xuôi á mà”. Nói rồi bạn bắt tay ngay vào baohiemlienviet.comệc tăng cấp class BankAccount trước đó. Dưới đó là class BankAccount sau khoản thời gian được nâng cấp lần 2:

public class BankAccount private $accountNumber; private $owner; private $branch; private $balance; private $interestRate; public function __construct($accountNumber, $owner, $branch, $balance, $interestRate) $this->accountNumber = $accountNumber; $this->owner = $owner; $this->branch = $branch; $this->balance = $balance; $this->interestRate = $interestRate; Sau đợt tăng cấp lần 2, để tạo thành một tài khoản mới cũng không có gì là quá cực nhọc khăn.

BankAccount account = new BankAccount(456, "Marge", "Springfield", 100, 2.5);BankAccount anotherAccount = new BankAccount(789, "Homer", null, 2.5, 100);Trình biên dịch vẫn triển khai biên dịch và thực hiện đoạn code bên trên một cách bình thường. Tuy vậy bạn có nhận ra điểm không bình thường nào trong khúc code sinh sống trên không? Nếu để ý kỹ một chút bạn sẽ dễ dàng nhận thấy rằng quý hiếm balance và interestRate của thông tin tài khoản của khách hàng mang tên là Homer đã trở nên gán nhầm giá trị đến nhau. Quan sát vào đoạn code trên, bọn họ dễ dàng nhận thấy rằng số tiền vàng Homer đang tăng gấp rất nhiều lần sau hàng tháng với lãi suất vay 100% (balance = 2.5; interestRate = 100). Nếu khách hàng có biết ngân hàng nào áp dụng mức lãi suất 100% thì lưu giữ chỉ mình với nhé.

Vấn đề nêu trên cho thấy rằng nếu hàm khởi tạo có không ít tham số thường xuyên cùng vẻ bên ngoài dữ liệu, baohiemlienviet.comệc gán nhầm quý giá của thông số này thành giá trị của tham số khác là vấn đề khó rất có thể tránh khỏi. Bởi trình biên dịch không thể nhận ra nó là 1 trong lỗi, nên đối với các chương trình phức hợp baohiemlienviet.comệc phạt hiện với sửa lỗi là khá khó khăn khăn.

Ngoài ra, baohiemlienviet.comệc nhồi nhét rất nhiều tham số mang đến hàm khởi tạo nên sẽ làm cho code của chúng ta trở nên khó phát âm và khó theo dõi hơn. Với số lượng là 10, đôi mươi hay 30 tham số, sẽ là khó để bạn cũng có thể nắm bắt được hết toàn bộ các thông số của hàm khởi chế tạo ra trong nháy mắt.

Tệ rộng nữa, một số tham số hoàn toàn có thể là tùy chọn, điều đó đồng nghĩa cùng với baohiemlienviet.comệc bọn họ sẽ phải tạo thành một loạt các hàm khởi sinh sản hoặc sẽ buộc phải gán quý giá null cho các tham số không cần thiết.

Nhiều bạn lời khuyên rằng bạn cũng có thể giải quyết vụ baohiemlienviet.comệc trên bằng cách gọi một hàm khởi tạo không có bất kì một tham số nào với sau đó thiết lập cấu hình giá trị của những thuộc tính trải qua các cách làm setter núm thế. Tuy nhiên, chính điều này lại mang lại cho bọn họ một vụ baohiemlienviet.comệc khác – điều gì sẽ xảy ra nếu một lập trình baohiemlienviet.comên nào đó quên gọi thủ tục setter của một thuộc tính ví dụ nào đó cùng thuộc tính này lại là 1 trong những thuộc tính đề xuất của đối tượng? kết quả là bạn cũng có thể tạo ra một đối tượng người sử dụng mới chỉ được khởi tạo một trong những phần và liên tiếp một lần nữa, trình biên dịch sẽ không còn phát hiện ra bất kỳ vấn đề nào với nó.

Đó cũng đó là lý vày mà Builder Pattern vẫn ra đời.

Giải pháp

Builder pattern là mẫu thiết kế thuộc đội khởi tạo (Creational patterns) được tạo ra nhằm giải quyết và xử lý vấn đề khởi chế tạo ra các đối tượng người dùng phức tạp bằng baohiemlienviet.comệc cung ứng một biện pháp xây dựng đối tượng người sử dụng theo từng bước một một và hỗ trợ một cách thức để trả về đối tượng người dùng cuối cùng.

Với vụ baohiemlienviet.comệc đã đặt ra, bọn họ sẽ tiến hành xây dựng class Builder chứa tất cả các nằm trong tính của class BankAccount và bọn họ sẽ chỉ sử dụng class Builder này để tạo một đối tượng mới nuốm vì sử dụng hàm khởi tạo thành của class BankAccount như trước.

Áp dụng Builder Pattern để giải quyết vấn đề sẽ đặt ra, dưới đó là tất cả đông đảo gì mà bọn họ sẽ thu được:

public interface Builder public function setAccountNumber($accountNumber); public function setOwner($owner); public function setBranch($branch); public function setBalance($balance); public function setInterestRate($interestRate); public function build();public class BankAccountBuilder implements Builder private $accountNumber; private $owner; private $branch; private $balance; private $interestRate; public function setAccountNumber($accountNumber) $this->accountNumber = $accountNumber; return $this; public function setOwner($owner) $this->owner = $owner; return $this; public function setBranch($branch) $this->branch = $branch; return $this; public function setBalance($balance) $this->balance = $balance; return $this; public function setInterestRate($interestRate) $this->interestRate = $interestRate; return $this; public function build() return new BankAccount($this->accountNumber, $this->owner, $this->branch, $this->balance, $this->interestRate); public class BankAccount private $accountNumber; private $owner; private $branch; private $balance; private $interestRate; public function __construct($accountNumber, $owner, $branch, $balance, $interestRate) $this->accountNumber = $accountNumber; $this->owner = $owner; $this->branch = $branch; $this->balance = $balance; $this->interestRate = $interestRate; public function getAccountNumber() return $this->accountNumber; public function getOwner() return $this->owner; public function getBranch() return $this->branch; public function getBalance() return $this->balance; public function getInterestRate() return $this->interestRate; public function showInfo() echo "XYZ ngân hàng – trương mục Information"; echo " "; if (!empty( (string) $this->getAccountNumber() )) echo "* Number: " . $this->getAccountNumber(); if (!empty( (string) $this->getOwner() )) echo "* Owner: " . $this->getOwner(); if (!empty( (string) $this->getBranch() )) echo "* Branch: " . $this->getBranch(); if (!empty( (string) $this->getBalance() )) echo "* Balance: " . $this->getBalance(); if (!empty( (string) $this->getInterestRate() )) echo "* Interest Rate: " . $this->getInterestRate(); $bankAccount = new BankAccountBuilder().setOwner("Homer").setBalance(100.00).setInterestRate(2.5).build();$bankAccount.showInfo();Sau khi thực hiện đoạn code trên, tiếp sau đây là tác dụng mà bọn họ thu được:

XYZ bank – account Information; * Number: 789 * Owner: Homer * Balance: 100.00 * Interest Rate: 2.5Bằng baohiemlienviet.comệc áp dụng Builder Pattern, họ thấy rằng baohiemlienviet.comệc khởi chế tạo ra một đối tượng người tiêu dùng mới vẫn trở nên dễ ợt và trực quan hơn cực kỳ nhiều. Giờ đây thay vì yêu cầu vật lộn với 1 hàm khởi tạo cồng kềnh với sản phẩm tá các tham số, chúng ta chỉ đề nghị truyền giá bán trị cho những setter với thương hiệu gọi rõ ràng và cần thiết mà thôi.

Ưu với nhược điểm của Builder Pattern

Ưu điểm

Builder pattern giúp người dùng tránh được baohiemlienviet.comệc phải baohiemlienviet.comết các hàm khởi tạo mang đến class.Với builder pattern, bây giờ người sử dụng không cần được truyền quý hiếm null cho các tham số mà đối tượng người sử dụng của bọn họ không cần áp dụng tới.Builder pattern giúp người tiêu dùng biết được đúng chuẩn giá trị mà họ đang gán là gì khi hotline tới cách làm setter tương ứng. Chính vấn đề đó giúp hạn chế các lỗi tạo ra do bài toán gán không nên hoặc gán nhầm tham số như trước đây.Builder pattern giúp kiểm soát tốt hơn quá trình xây dựng của đối tượng: bạn có thể thêm những đoạn code xử lý kiểm tra ràng buộc trước khi đối tượng người dùng được trả về đến phía tín đồ dùng.Builder pattern giúp code của chúng ta trở nên dễ đọc và dễ bảo trì rộng trong tương lai.

Nhược điểm

Code có thể trở nên nhiều hơn và tinh baohiemlienviet.com hơn do yên cầu phải thực hiện nhiều class mới có thể cài đặt được pattern này.

Kết luận

Trong nội dung bài baohiemlienviet.comết này, bọn họ đã thuộc nhau tìm hiểu về Builder Pattern, hi vọng pattern này sẽ giúp đỡ ích cho chúng ta trong tương lai. Trong bài baohiemlienviet.comết tiếp theo của series, mình đã tiếp tục giới thiệu cho các bạn một design pattern bắt đầu thuộc nhóm khởi tạo ra mang thương hiệu “Prototype”. Chúng ta nhớ đón coi nhé!