SlideShare a Scribd company logo
1 of 62
Download to read offline
Mental Log Week 11

Builder Pattern
Dinh Hoang Long
Mental Log

Dinh Hoang Long, Mental Log

Builder Pattern

1/28
Outline

Outline
Bài toán, vấn đề
Builder Pattern
Ý tưởng cơ bản
Áp dụng vào bài toán
Phân tích các thành phần trong Builder Pattern

Builder Pattern trong thực tế
Java: StringBuiler
PHP: Zend_Db_Select

Dinh Hoang Long, Mental Log

Builder Pattern

2/28
Bài toán, vấn đề

Bài toán, vấn đề
1 đối tượng phức tạp được tạo ra từ nhiều thành phần nhỏ

Dinh Hoang Long, Mental Log

Builder Pattern

3/28
Bài toán, vấn đề

Bài toán, vấn đề
1 đối tượng phức tạp được tạo ra từ nhiều thành phần nhỏ
Trong các thành phần tạo nên đối tượng, có thành phần bắt buộc và
thành phần không bắt buộc

Dinh Hoang Long, Mental Log

Builder Pattern

3/28
Bài toán, vấn đề

User Class
public class User {
private String first_name ;
// required
private String last_name ;
// required
private int age ; // optional
private String phone ; // optional
private String address ; // optional
...
}

Dinh Hoang Long, Mental Log

Builder Pattern

4/28
Bài toán, vấn đề

User Class
Constructor:
public User ( String first_name_in , String last_name_in , int age_in , String phone_in ,
String address_in ) {
first_name = first_name_in ;
last_name = last_name_in ;
age = age_in ;
phone = phone_in ;
address = address_in ;
}

Dinh Hoang Long, Mental Log

Builder Pattern

5/28
Bài toán, vấn đề

User Class
Constructor:
public User ( String first_name_in , String last_name_in , int age_in , String phone_in ,
String address_in ) {
first_name = first_name_in ;
last_name = last_name_in ;
age = age_in ;
phone = phone_in ;
address = address_in ;
}
public User ( String first_name_in , String last_name_in , int age_in , String phone_in ) {
this ( first_name_in , last_name_in , age_in , phone_in , " " ) ;
}

Dinh Hoang Long, Mental Log

Builder Pattern

6/28
Bài toán, vấn đề

User Class
Constructor:
public User ( String first_name_in , String last_name_in ,
String address_in ) {
first_name = first_name_in ;
last_name = last_name_in ;
age = age_in ;
phone = phone_in ;
address = address_in ;
}
public User ( String first_name_in , String last_name_in ,
this ( first_name_in , last_name_in , age_in , phone_in ,
}
public User ( String first_name_in , String last_name_in ,
this ( first_name_in , last_name_in , age_in , " " ) ;
}

Dinh Hoang Long, Mental Log

Builder Pattern

int age_in , String phone_in ,

int age_in , String phone_in ) {
"");
int age_in ) {

7/28
Bài toán, vấn đề

User Class
Constructor:
public User ( String first_name_in , String last_name_in , int age_in , String phone_in ,
String address_in ) {
first_name = first_name_in ;
last_name = last_name_in ;
age = age_in ;
phone = phone_in ;
address = address_in ;
}
public User ( String first_name_in , String last_name_in , int age_in , String phone_in ) {
this ( first_name_in , last_name_in , age_in , phone_in , " " ) ;
}
public User ( String first_name_in , String last_name_in , int age_in ) {
this ( first_name_in , last_name_in , age_in , " " ) ;
}
public User ( String first_name_in , String last_name_in ) {
this ( first_name_in , last_name_in , 0) ;
}

Dinh Hoang Long, Mental Log

Builder Pattern

8/28
Bài toán, vấn đề

User Class
Constructor: PHP
public function User ( $first_name_in , $last_name_in , $age_in = 0 , $phone_in = " " ,
$address_in = " " ) {
$first_name = $first_name_in ;
$last_name = $last_name_in ;
$age = $age_in ;
$phone = $phone_in ;
$address = $address_in ;
}

Dinh Hoang Long, Mental Log

Builder Pattern

9/28
Bài toán, vấn đề

User Class
Nhược điểm:
Khi số lượng tham số nhiều lên thì số lượng Constructor cần viết
nhiều lên

Dinh Hoang Long, Mental Log

Builder Pattern

10/28
Bài toán, vấn đề

User Class
Nhược điểm:
Khi số lượng tham số nhiều lên thì số lượng Constructor cần viết
nhiều lên
Khó nắm bắt được thứ tự các tham số trong Constructor

Dinh Hoang Long, Mental Log

Builder Pattern

10/28
Bài toán, vấn đề

User Class
Nhược điểm:
Khi số lượng tham số nhiều lên thì số lượng Constructor cần viết
nhiều lên
Khó nắm bắt được thứ tự các tham số trong Constructor
Cằn nắm rõ default của các tham số không muốn set.
User hlong = new User ( " Dinh " , " Hoang Long " , 22 , " " , " Hanoi " ) ;

Dinh Hoang Long, Mental Log

Builder Pattern

10/28
Bài toán, vấn đề

User Class
Giải pháp: JavaBeans Convention
Tạo 1 constructor không có tham số nào (0-argument constructor),
hoặc 1 constructor duy nhất với số lượng tham số tối thiểu.

Dinh Hoang Long, Mental Log

Builder Pattern

11/28
Bài toán, vấn đề

User Class
Giải pháp: JavaBeans Convention
Tạo 1 constructor không có tham số nào (0-argument constructor),
hoặc 1 constructor duy nhất với số lượng tham số tối thiểu.
Sử dụng các phương thức SetX (input_value) để chỉ định các giá trị
muốn set.
class User {
...
public void setAge ( age_in ) {
age = age_in ;
}
}
User hlong = new User ( " Dinh " , " Hoang Long " ) ;
hlong . setAge (22) ;

Dinh Hoang Long, Mental Log

Builder Pattern

11/28
Bài toán, vấn đề

User Class
Giải pháp: JavaBeans Convention
Tạo 1 constructor không có tham số nào (0-argument constructor),
hoặc 1 constructor duy nhất với số lượng tham số tối thiểu.
Sử dụng các phương thức SetX (input_value) để chỉ định các giá trị
muốn set.
class User {
...
public void setAge ( age_in ) {
age = age_in ;
}
}
User hlong = new User ( " Dinh " , " Hoang Long " ) ;
hlong . setAge (22) ;

Nhược điểm?

Dinh Hoang Long, Mental Log

Builder Pattern

11/28
Bài toán, vấn đề

User Class
Nhược điểm
Object được tạo ra trở nên không bền vững, dễ bị thay đổi.

Dinh Hoang Long, Mental Log

Builder Pattern

12/28
Bài toán, vấn đề

User Class
Nhược điểm
Object được tạo ra trở nên không bền vững, dễ bị thay đổi.
Người sử dụng khó kiểm soát được trạng thái của object
(Vì quá dễ bị thay đổi).

Dinh Hoang Long, Mental Log

Builder Pattern

12/28
Bài toán, vấn đề

User Class
Nhược điểm
Object được tạo ra trở nên không bền vững, dễ bị thay đổi.
Người sử dụng khó kiểm soát được trạng thái của object
(Vì quá dễ bị thay đổi).

Giải pháp: Builder Pattern

Dinh Hoang Long, Mental Log

Builder Pattern

12/28
Builder Pattern

Ý tưởng cơ bản

Ý tưởng cơ bản
Builder Pattern
Là 1 pattern dành cho việc tạo object (creational pattern)

Dinh Hoang Long, Mental Log

Builder Pattern

13/28
Builder Pattern

Ý tưởng cơ bản

Ý tưởng cơ bản
Builder Pattern
Là 1 pattern dành cho việc tạo object (creational pattern)
Builder pattern được sử dụng khi số lượng tham số cần thiết tạo 1
object là lớn (>4), hoặc quá trình tạo object phức tạp.

Dinh Hoang Long, Mental Log

Builder Pattern

13/28
Builder Pattern

Ý tưởng cơ bản

Ý tưởng cơ bản
Builder Pattern
Là 1 pattern dành cho việc tạo object (creational pattern)
Builder pattern được sử dụng khi số lượng tham số cần thiết tạo 1
object là lớn (>4), hoặc quá trình tạo object phức tạp.
Builder pattern sử dụng 1 object có vai trò Builder, để tạo 1 object
khác.

Dinh Hoang Long, Mental Log

Builder Pattern

13/28
Builder Pattern

Áp dụng vào bài toán

Áp dụng vào bài toán
Ý tưởng
Tạo 1 class UserBuilder có vai trò tạo 1 object cho class User.

Dinh Hoang Long, Mental Log

Builder Pattern

14/28
Builder Pattern

Áp dụng vào bài toán

Áp dụng vào bài toán
Ý tưởng
Tạo 1 class UserBuilder có vai trò tạo 1 object cho class User.
Việc tạo object cho class User bị ràng buộc phải qua UserBuilder.

Dinh Hoang Long, Mental Log

Builder Pattern

14/28
Builder Pattern

Áp dụng vào bài toán

Áp dụng vào bài toán
Ý tưởng
Tạo 1 class UserBuilder có vai trò tạo 1 object cho class User.
Việc tạo object cho class User bị ràng buộc phải qua UserBuilder.

Giải pháp: Nested Class

Dinh Hoang Long, Mental Log

Builder Pattern

14/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
class User {
public static class UserBuilder () {
private String first_name ;
private String last_name ;
private int age = 0;
private String phone = " " ;
private String address = " " ;
public UserBuilder ( String first_name_in , String last_name_in ) {
first_name = first_name_in ;
last_name = last_name_in ;
}
}
}

Dinh Hoang Long, Mental Log

Builder Pattern

15/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
class User {
public static class UserBuilder () {
private String first_name ;
private String last_name ;
private int age = 0;
private String phone = " " ;
private String address = " " ;
public UserBuilder ( String first_name_in , String last_name_in ) {
first_name = first_name_in ;
last_name = last_name_in ;
}
public UserBuilder age ( int age_in ) {
age = age_in ;
return this ;
}
}
}

Dinh Hoang Long, Mental Log

Builder Pattern

16/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
class User {
public static class UserBuilder () {
private String first_name ;
private String last_name ;
private int age = 0;
private String phone = " " ;
private String address = " " ;
public UserBuilder ( String first_name_in , String last_name_in ) {
first_name = first_name_in ;
last_name = last_name_in ;
}
public UserBuilder age ( int age_in ) {
age = age_in ;
return this ;
}
public UserBuilder phone ( String phone_in ) {
phone = phone_in ;
return this ;
}
public UserBuilder address ( String address_in ) {
address = address_in ;
return this ;
}
}
}

Dinh Hoang Long, Mental Log

Builder Pattern

17/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
class User {
public static class UserBuilder () {
private String first_name ;
private String last_name ;
private int age = 0;
private String phone = " " ;
private String address = " " ;
public UserBuilder ( String first_name_in , String last_name_in ) {
first_name = first_name_in ;
last_name = last_name_in ;
}
public UserBuilder age ( int age_in ) {
age = age_in ;
return this ;
}
public UserBuilder phone ( String phone_in ) {
phone = phone_in ;
return this ;
}
public UserBuilder address ( String address_in ) {
address = address_in ;
return this ;
}
public User build () {
return new User ( this ) ;
}
}
}
Dinh Hoang Long, Mental Log

Builder Pattern

18/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
class User {
private String first_name ;
private String last_name ;
private int age ;
private String phone ;
private String address ;
public static class UserBuilder {
...
}
private User ( UserBuilder builder ) {
first_name = builder . first_name ;
last_name = builder . last_name ;
age = builder . age ;
phone = builder . phone ;
address = builder . address ;
}
}

Dinh Hoang Long, Mental Log

Builder Pattern

19/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
class User {
private String first_name ;
private String last_name ;
private int age ;
private String phone ;
private String address ;
public static class UserBuilder {
...
}
private User ( UserBuilder builder ) {
first_name = builder . first_name ;
last_name = builder . last_name ;
age = builder . age ;
phone = builder . phone ;
address = builder . address ;
}
}

Sử dụng
User hlong = new User . UserBuilder ( " dinh " , " hoang long " )
. age (23)
. address ( " Hanoi " )
. build () ;

Dinh Hoang Long, Mental Log

Builder Pattern

19/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
Có nhất thiết phải sự dụng "nested class"?
Điều gì xảy ra nếu sử dụng "outside class"?

Dinh Hoang Long, Mental Log

Builder Pattern

20/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
Có nhất thiết phải sự dụng "nested class"?
Điều gì xảy ra nếu sử dụng "outside class"?
Khi nào cần tạo 1 class builder riêng:

Dinh Hoang Long, Mental Log

Builder Pattern

20/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
Có nhất thiết phải sự dụng "nested class"?
Điều gì xảy ra nếu sử dụng "outside class"?
Khi nào cần tạo 1 class builder riêng:
Công việc build các thành phần của product là phức tạp.

Dinh Hoang Long, Mental Log

Builder Pattern

20/28
Builder Pattern

Áp dụng vào bài toán

UserBuilder Class
Có nhất thiết phải sự dụng "nested class"?
Điều gì xảy ra nếu sử dụng "outside class"?
Khi nào cần tạo 1 class builder riêng:
Công việc build các thành phần của product là phức tạp.
Chỉ thông qua builder mới có thể tạo được các thành phần cho
product.

Dinh Hoang Long, Mental Log

Builder Pattern

20/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Phân tích các thành phần trong Builder Pattern

Hình 1: Sơ đồ UML đầy đủ của 1 Builder Pattern

Dinh Hoang Long, Mental Log

Builder Pattern

21/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Vai trò của các thành phần
Builder
Quản lý cách mà các thành phần của object sẽ được tạo ra
(How part is built).

Dinh Hoang Long, Mental Log

Builder Pattern

22/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Vai trò của các thành phần
Builder
Quản lý cách mà các thành phần của object sẽ được tạo ra
(How part is built).

Director
Quản lý cách mà các thành phần được lắp ráp, tháo bỏ
(How to assemble part).

Dinh Hoang Long, Mental Log

Builder Pattern

22/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Vai trò của các thành phần
Builder
Quản lý cách mà các thành phần của object sẽ được tạo ra
(How part is built).

Director
Quản lý cách mà các thành phần được lắp ráp, tháo bỏ
(How to assemble part).
Vai trò: Thông báo với builder khi nào 1 thành phần cần được tạo ra.

Dinh Hoang Long, Mental Log

Builder Pattern

22/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Vai trò của các thành phần
Builder
Quản lý cách mà các thành phần của object sẽ được tạo ra
(How part is built).

Director
Quản lý cách mà các thành phần được lắp ráp, tháo bỏ
(How to assemble part).
Vai trò: Thông báo với builder khi nào 1 thành phần cần được tạo ra.
Công việc của Director có thể thực hiện trực tiếp bởi client

Dinh Hoang Long, Mental Log

Builder Pattern

22/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Vai trò của các thành phần
Builder
Quản lý cách mà các thành phần của object sẽ được tạo ra
(How part is built).

Director
Quản lý cách mà các thành phần được lắp ráp, tháo bỏ
(How to assemble part).
Vai trò: Thông báo với builder khi nào 1 thành phần cần được tạo ra.
Công việc của Director có thể thực hiện trực tiếp bởi client
→ Có thể bỏ class Director, client có thể tự tạo object nhờ Builder.

Dinh Hoang Long, Mental Log

Builder Pattern

22/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Vai trò của các thành phần
Builder
Quản lý cách mà các thành phần của object sẽ được tạo ra
(How part is built).

Director
Quản lý cách mà các thành phần được lắp ráp, tháo bỏ
(How to assemble part).
Vai trò: Thông báo với builder khi nào 1 thành phần cần được tạo ra.
Công việc của Director có thể thực hiện trực tiếp bởi client
→ Có thể bỏ class Director, client có thể tự tạo object nhờ Builder.
Khi nào cần Director?

Dinh Hoang Long, Mental Log

Builder Pattern

22/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Director
Khi nào cần Director:
Khi việc lắp ráp các thành phần của product là phức tạp.
Không quá đơn giản hoặc không thể làm tùy ý.

Dinh Hoang Long, Mental Log

Builder Pattern

23/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Director
Khi nào cần Director:
Khi việc lắp ráp các thành phần của product là phức tạp.
Không quá đơn giản hoặc không thể làm tùy ý.
Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo
ra 1 product)

Dinh Hoang Long, Mental Log

Builder Pattern

23/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Director
Khi nào cần Director:
Khi việc lắp ráp các thành phần của product là phức tạp.
Không quá đơn giản hoặc không thể làm tùy ý.
Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo
ra 1 product)
Quá trình lắp đặt là cố định

Dinh Hoang Long, Mental Log

Builder Pattern

23/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Director
Khi nào cần Director:
Khi việc lắp ráp các thành phần của product là phức tạp.
Không quá đơn giản hoặc không thể làm tùy ý.
Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo
ra 1 product)
Quá trình lắp đặt là cố định
Nhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng gói
quá trình tạo product.
(Director lúc này chỉ cần làm việc với AbstractBuilder)

Dinh Hoang Long, Mental Log

Builder Pattern

23/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Director
Khi nào cần Director:
Khi việc lắp ráp các thành phần của product là phức tạp.
Không quá đơn giản hoặc không thể làm tùy ý.
Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo
ra 1 product)
Quá trình lắp đặt là cố định
Nhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng gói
quá trình tạo product.
(Director lúc này chỉ cần làm việc với AbstractBuilder)

Khi nào không cần Director

Dinh Hoang Long, Mental Log

Builder Pattern

23/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Director
Khi nào cần Director:
Khi việc lắp ráp các thành phần của product là phức tạp.
Không quá đơn giản hoặc không thể làm tùy ý.
Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo
ra 1 product)
Quá trình lắp đặt là cố định
Nhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng gói
quá trình tạo product.
(Director lúc này chỉ cần làm việc với AbstractBuilder)

Khi nào không cần Director
Quá trình lắp đặt không cần thứ tự cụ thể

Dinh Hoang Long, Mental Log

Builder Pattern

23/28
Builder Pattern

Phân tích các thành phần trong Builder Pattern

Director
Khi nào cần Director:
Khi việc lắp ráp các thành phần của product là phức tạp.
Không quá đơn giản hoặc không thể làm tùy ý.
Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo
ra 1 product)
Quá trình lắp đặt là cố định
Nhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng gói
quá trình tạo product.
(Director lúc này chỉ cần làm việc với AbstractBuilder)

Khi nào không cần Director
Quá trình lắp đặt không cần thứ tự cụ thể
Quá trình lắp đặt cần nhiều tùy biến

Dinh Hoang Long, Mental Log

Builder Pattern

23/28
Builder Pattern trong thực tế

Builder Pattern trong thực tế
Java StringBuilder
PHP Zend_Db_Select

Dinh Hoang Long, Mental Log

Builder Pattern

24/28
Builder Pattern trong thực tế

Java StringBuilder

Java StringBuilder
String trong Java
Không thể thay đổi

Dinh Hoang Long, Mental Log

Builder Pattern

25/28
Builder Pattern trong thực tế

Java StringBuilder

Java StringBuilder
String trong Java
Không thể thay đổi
Mỗi thao tác chèn ký tự, xóa ký tự, đổi chữ hoa thành chữ thường,...
đều tạo ra object mới → Tốn bộ nhớ!

Dinh Hoang Long, Mental Log

Builder Pattern

25/28
Builder Pattern trong thực tế

Java StringBuilder

Java StringBuilder
StringBuilder trong Java
Dễ dàng thực hiện các thao tác chèn, xóa,... đối với String.

Dinh Hoang Long, Mental Log

Builder Pattern

26/28
Builder Pattern trong thực tế

Java StringBuilder

Java StringBuilder
StringBuilder trong Java
Dễ dàng thực hiện các thao tác chèn, xóa,... đối với String.
Sử dụng phương thức toString để tạo ra String cuối cùng
(Giống với phương thức getResult() trong mô hình của
Builder Pattern).

Dinh Hoang Long, Mental Log

Builder Pattern

26/28
Builder Pattern trong thực tế

Java StringBuilder

Java StringBuilder
StringBuilder trong Java
Dễ dàng thực hiện các thao tác chèn, xóa,... đối với String.
Sử dụng phương thức toString để tạo ra String cuối cùng
(Giống với phương thức getResult() trong mô hình của
Builder Pattern).
Ví dụ:
String orgStr = " hello " ;
StringBuilder builder = new StringBuilder () ;
builder . append ( orgStr ) ;
builder . deleteCharAt ( orgStr . length () -1)
. insert (0 , " a " ) ;
System . out . println ( builder . toString () ) ;
// output : ahell

Dinh Hoang Long, Mental Log

Builder Pattern

26/28
Builder Pattern trong thực tế

Java StringBuilder

Java StringBuilder
Nhận xét về StringBuilder
Lợi thế hơn String vì không phải tạo object mới.
→Sử dụng khi muốn thay đổi 1 String.
Tạo object bằng: new StringBuilder (String s)

Dinh Hoang Long, Mental Log

Builder Pattern

27/28
Builder Pattern trong thực tế

Java StringBuilder

Java StringBuilder
Nhận xét về StringBuilder
Lợi thế hơn String vì không phải tạo object mới.
→Sử dụng khi muốn thay đổi 1 String.
Tạo object bằng: new StringBuilder (String s)
Lợi thế hơn StringBuffer vì không cần bảo đảm thread-safety
(không synchronization, nhanh hơn StringBuffer).

Dinh Hoang Long, Mental Log

Builder Pattern

27/28
Builder Pattern trong thực tế

PHP Zend_Db_Select

PHP Zend_Db_Select
Zend_Db_Select: Tạo 1 câu truy vấn MySQL

Dinh Hoang Long, Mental Log

Builder Pattern

28/28
Builder Pattern trong thực tế

PHP Zend_Db_Select

PHP Zend_Db_Select
Zend_Db_Select: Tạo 1 câu truy vấn MySQL
Ví dụ:
// Z e n d _ D b _ A d a p t e r _ P d o : $db
$select = new Zend_Db_Select ( $db ) ;
$select - > from ( " user " )
-> where ( " user_id > 10 " )
-> order ( " user_id DESC " )
-> limit (10) ;

Dinh Hoang Long, Mental Log

Builder Pattern

28/28
Builder Pattern trong thực tế

PHP Zend_Db_Select

PHP Zend_Db_Select
Zend_Db_Select: Tạo 1 câu truy vấn MySQL
Ví dụ:
// Z e n d _ D b _ A d a p t e r _ P d o : $db
$select = new Zend_Db_Select ( $db ) ;
$select - > from ( " user " )
-> where ( " user_id > 10 " )
-> order ( " user_id DESC " )
-> limit (10) ;
// $stmt : Z e n d _ D b _ S t a t e m e n t
$stmt = $select - > query () ;

Dinh Hoang Long, Mental Log

Builder Pattern

28/28
Builder Pattern trong thực tế

PHP Zend_Db_Select

PHP Zend_Db_Select
Zend_Db_Select: Tạo 1 câu truy vấn MySQL
Ví dụ:
// Z e n d _ D b _ A d a p t e r _ P d o : $db
$select = new Zend_Db_Select ( $db ) ;
$select - > from ( " user " )
-> where ( " user_id > 10 " )
-> order ( " user_id DESC " )
-> limit (10) ;
// $stmt : Z e n d _ D b _ S t a t e m e n t
$stmt = $select - > query () ;

Tương ứng với:
SELECT ∗ FROM user WHERE user _id > 10 ORDER BY user _id DESC LIMIT 10;

Dinh Hoang Long, Mental Log

Builder Pattern

28/28
Builder Pattern trong thực tế

PHP Zend_Db_Select

PHP Zend_Db_Select
Zend_Db_Select: Tạo 1 câu truy vấn MySQL
Ví dụ:
// Z e n d _ D b _ A d a p t e r _ P d o : $db
$select = new Zend_Db_Select ( $db ) ;
$select - > from ( " user " )
-> where ( " user_id > 10 " )
-> order ( " user_id DESC " )
-> limit (10) ;
// $stmt : Z e n d _ D b _ S t a t e m e n t
$stmt = $select - > query () ;

Tương ứng với:
SELECT ∗ FROM user WHERE user _id > 10 ORDER BY user _id DESC LIMIT 10;

Không dùng builder pattern !!!
class Ze nd_Db_Select {
public function _construct ( $table_name , $where = " " , $order = " " , $limit = " " ,...) {}
}

Dinh Hoang Long, Mental Log

Builder Pattern

28/28

More Related Content

Viewers also liked

Gnostics
GnosticsGnostics
GnosticsGnito
 
Façade pattern
Façade patternFaçade pattern
Façade patternmentallog
 
Diapositivas mishelle quiroz
Diapositivas mishelle quirozDiapositivas mishelle quiroz
Diapositivas mishelle quirozmishibu_cristi
 
Break out game
Break out gameBreak out game
Break out gamementallog
 
Gnito Deck
Gnito DeckGnito Deck
Gnito DeckGnito
 
Composite pattern
Composite patternComposite pattern
Composite patternmentallog
 
Going Responsive: Making your Desktop Site Mobile (A City of Vancouver Case S...
Going Responsive: Making your Desktop Site Mobile (A City of Vancouver Case S...Going Responsive: Making your Desktop Site Mobile (A City of Vancouver Case S...
Going Responsive: Making your Desktop Site Mobile (A City of Vancouver Case S...City of Vancouver
 
3. transpo system overview
3. transpo system overview3. transpo system overview
3. transpo system overviewDeuce Condenuevo
 
Mentallog12 10
Mentallog12 10Mentallog12 10
Mentallog12 10mentallog
 
Agile software development
Agile software developmentAgile software development
Agile software developmentmentallog
 
Modelo para elaboração do portfolio individual unopar 2015
Modelo para elaboração do portfolio individual unopar 2015Modelo para elaboração do portfolio individual unopar 2015
Modelo para elaboração do portfolio individual unopar 2015daniela oliveira
 
Universal design of learning
Universal design of learningUniversal design of learning
Universal design of learningbeccastrauss
 
Little red ridinghood
Little red ridinghoodLittle red ridinghood
Little red ridinghoodSimone Becker
 
The dimension of meaning
The dimension of meaningThe dimension of meaning
The dimension of meaningIhsan Pratama
 
Design Patterns: Builder pattern (Le monteur)
Design Patterns: Builder pattern (Le monteur)Design Patterns: Builder pattern (Le monteur)
Design Patterns: Builder pattern (Le monteur)RadhoueneRouached
 

Viewers also liked (19)

Gnostics
GnosticsGnostics
Gnostics
 
Façade pattern
Façade patternFaçade pattern
Façade pattern
 
Diapositivas mishelle quiroz
Diapositivas mishelle quirozDiapositivas mishelle quiroz
Diapositivas mishelle quiroz
 
Break out game
Break out gameBreak out game
Break out game
 
Gnito Deck
Gnito DeckGnito Deck
Gnito Deck
 
Establishing Rapport
 Establishing Rapport    Establishing Rapport
Establishing Rapport
 
Composite pattern
Composite patternComposite pattern
Composite pattern
 
Nosql
NosqlNosql
Nosql
 
Going Responsive: Making your Desktop Site Mobile (A City of Vancouver Case S...
Going Responsive: Making your Desktop Site Mobile (A City of Vancouver Case S...Going Responsive: Making your Desktop Site Mobile (A City of Vancouver Case S...
Going Responsive: Making your Desktop Site Mobile (A City of Vancouver Case S...
 
3. transpo system overview
3. transpo system overview3. transpo system overview
3. transpo system overview
 
Mentallog12 10
Mentallog12 10Mentallog12 10
Mentallog12 10
 
Agile software development
Agile software developmentAgile software development
Agile software development
 
Modelo para elaboração do portfolio individual unopar 2015
Modelo para elaboração do portfolio individual unopar 2015Modelo para elaboração do portfolio individual unopar 2015
Modelo para elaboração do portfolio individual unopar 2015
 
Universal design of learning
Universal design of learningUniversal design of learning
Universal design of learning
 
Little red ridinghood
Little red ridinghoodLittle red ridinghood
Little red ridinghood
 
The dimension of meaning
The dimension of meaningThe dimension of meaning
The dimension of meaning
 
Design Patterns: Builder pattern (Le monteur)
Design Patterns: Builder pattern (Le monteur)Design Patterns: Builder pattern (Le monteur)
Design Patterns: Builder pattern (Le monteur)
 
Research papers
Research papersResearch papers
Research papers
 
Speech
SpeechSpeech
Speech
 

Similar to Builder pattern

Builder Pattern
Builder PatternBuilder Pattern
Builder PatternHoang Long
 
Bao cao de tai thi trac nghiem tieng anh
Bao cao de tai thi trac nghiem tieng anhBao cao de tai thi trac nghiem tieng anh
Bao cao de tai thi trac nghiem tieng anhKết Vẻ
 
Bao cao de tai thi trac nghiem tieng anh
Bao cao de tai thi trac nghiem tieng anhBao cao de tai thi trac nghiem tieng anh
Bao cao de tai thi trac nghiem tieng anhHoa Huong
 
Android Nâng cao-Bài 6-Multi theme-adb tool-jUnit
Android Nâng cao-Bài 6-Multi theme-adb tool-jUnitAndroid Nâng cao-Bài 6-Multi theme-adb tool-jUnit
Android Nâng cao-Bài 6-Multi theme-adb tool-jUnitPhuoc Nguyen
 
Ke hoach giang day
Ke hoach giang dayKe hoach giang day
Ke hoach giang dayTâm Phan
 
Lap trinh java hieu qua
Lap trinh java hieu quaLap trinh java hieu qua
Lap trinh java hieu quaLê Anh
 
Cq lt hdt-th2011-01-tuan02
Cq lt hdt-th2011-01-tuan02Cq lt hdt-th2011-01-tuan02
Cq lt hdt-th2011-01-tuan02. .
 
Lập trình Android cơ bản bằng tiếng Việt
Lập trình Android cơ bản bằng tiếng ViệtLập trình Android cơ bản bằng tiếng Việt
Lập trình Android cơ bản bằng tiếng Việtlaptrinhandroid
 

Similar to Builder pattern (8)

Builder Pattern
Builder PatternBuilder Pattern
Builder Pattern
 
Bao cao de tai thi trac nghiem tieng anh
Bao cao de tai thi trac nghiem tieng anhBao cao de tai thi trac nghiem tieng anh
Bao cao de tai thi trac nghiem tieng anh
 
Bao cao de tai thi trac nghiem tieng anh
Bao cao de tai thi trac nghiem tieng anhBao cao de tai thi trac nghiem tieng anh
Bao cao de tai thi trac nghiem tieng anh
 
Android Nâng cao-Bài 6-Multi theme-adb tool-jUnit
Android Nâng cao-Bài 6-Multi theme-adb tool-jUnitAndroid Nâng cao-Bài 6-Multi theme-adb tool-jUnit
Android Nâng cao-Bài 6-Multi theme-adb tool-jUnit
 
Ke hoach giang day
Ke hoach giang dayKe hoach giang day
Ke hoach giang day
 
Lap trinh java hieu qua
Lap trinh java hieu quaLap trinh java hieu qua
Lap trinh java hieu qua
 
Cq lt hdt-th2011-01-tuan02
Cq lt hdt-th2011-01-tuan02Cq lt hdt-th2011-01-tuan02
Cq lt hdt-th2011-01-tuan02
 
Lập trình Android cơ bản bằng tiếng Việt
Lập trình Android cơ bản bằng tiếng ViệtLập trình Android cơ bản bằng tiếng Việt
Lập trình Android cơ bản bằng tiếng Việt
 

Builder pattern

  • 1. Mental Log Week 11 Builder Pattern Dinh Hoang Long Mental Log Dinh Hoang Long, Mental Log Builder Pattern 1/28
  • 2. Outline Outline Bài toán, vấn đề Builder Pattern Ý tưởng cơ bản Áp dụng vào bài toán Phân tích các thành phần trong Builder Pattern Builder Pattern trong thực tế Java: StringBuiler PHP: Zend_Db_Select Dinh Hoang Long, Mental Log Builder Pattern 2/28
  • 3. Bài toán, vấn đề Bài toán, vấn đề 1 đối tượng phức tạp được tạo ra từ nhiều thành phần nhỏ Dinh Hoang Long, Mental Log Builder Pattern 3/28
  • 4. Bài toán, vấn đề Bài toán, vấn đề 1 đối tượng phức tạp được tạo ra từ nhiều thành phần nhỏ Trong các thành phần tạo nên đối tượng, có thành phần bắt buộc và thành phần không bắt buộc Dinh Hoang Long, Mental Log Builder Pattern 3/28
  • 5. Bài toán, vấn đề User Class public class User { private String first_name ; // required private String last_name ; // required private int age ; // optional private String phone ; // optional private String address ; // optional ... } Dinh Hoang Long, Mental Log Builder Pattern 4/28
  • 6. Bài toán, vấn đề User Class Constructor: public User ( String first_name_in , String last_name_in , int age_in , String phone_in , String address_in ) { first_name = first_name_in ; last_name = last_name_in ; age = age_in ; phone = phone_in ; address = address_in ; } Dinh Hoang Long, Mental Log Builder Pattern 5/28
  • 7. Bài toán, vấn đề User Class Constructor: public User ( String first_name_in , String last_name_in , int age_in , String phone_in , String address_in ) { first_name = first_name_in ; last_name = last_name_in ; age = age_in ; phone = phone_in ; address = address_in ; } public User ( String first_name_in , String last_name_in , int age_in , String phone_in ) { this ( first_name_in , last_name_in , age_in , phone_in , " " ) ; } Dinh Hoang Long, Mental Log Builder Pattern 6/28
  • 8. Bài toán, vấn đề User Class Constructor: public User ( String first_name_in , String last_name_in , String address_in ) { first_name = first_name_in ; last_name = last_name_in ; age = age_in ; phone = phone_in ; address = address_in ; } public User ( String first_name_in , String last_name_in , this ( first_name_in , last_name_in , age_in , phone_in , } public User ( String first_name_in , String last_name_in , this ( first_name_in , last_name_in , age_in , " " ) ; } Dinh Hoang Long, Mental Log Builder Pattern int age_in , String phone_in , int age_in , String phone_in ) { ""); int age_in ) { 7/28
  • 9. Bài toán, vấn đề User Class Constructor: public User ( String first_name_in , String last_name_in , int age_in , String phone_in , String address_in ) { first_name = first_name_in ; last_name = last_name_in ; age = age_in ; phone = phone_in ; address = address_in ; } public User ( String first_name_in , String last_name_in , int age_in , String phone_in ) { this ( first_name_in , last_name_in , age_in , phone_in , " " ) ; } public User ( String first_name_in , String last_name_in , int age_in ) { this ( first_name_in , last_name_in , age_in , " " ) ; } public User ( String first_name_in , String last_name_in ) { this ( first_name_in , last_name_in , 0) ; } Dinh Hoang Long, Mental Log Builder Pattern 8/28
  • 10. Bài toán, vấn đề User Class Constructor: PHP public function User ( $first_name_in , $last_name_in , $age_in = 0 , $phone_in = " " , $address_in = " " ) { $first_name = $first_name_in ; $last_name = $last_name_in ; $age = $age_in ; $phone = $phone_in ; $address = $address_in ; } Dinh Hoang Long, Mental Log Builder Pattern 9/28
  • 11. Bài toán, vấn đề User Class Nhược điểm: Khi số lượng tham số nhiều lên thì số lượng Constructor cần viết nhiều lên Dinh Hoang Long, Mental Log Builder Pattern 10/28
  • 12. Bài toán, vấn đề User Class Nhược điểm: Khi số lượng tham số nhiều lên thì số lượng Constructor cần viết nhiều lên Khó nắm bắt được thứ tự các tham số trong Constructor Dinh Hoang Long, Mental Log Builder Pattern 10/28
  • 13. Bài toán, vấn đề User Class Nhược điểm: Khi số lượng tham số nhiều lên thì số lượng Constructor cần viết nhiều lên Khó nắm bắt được thứ tự các tham số trong Constructor Cằn nắm rõ default của các tham số không muốn set. User hlong = new User ( " Dinh " , " Hoang Long " , 22 , " " , " Hanoi " ) ; Dinh Hoang Long, Mental Log Builder Pattern 10/28
  • 14. Bài toán, vấn đề User Class Giải pháp: JavaBeans Convention Tạo 1 constructor không có tham số nào (0-argument constructor), hoặc 1 constructor duy nhất với số lượng tham số tối thiểu. Dinh Hoang Long, Mental Log Builder Pattern 11/28
  • 15. Bài toán, vấn đề User Class Giải pháp: JavaBeans Convention Tạo 1 constructor không có tham số nào (0-argument constructor), hoặc 1 constructor duy nhất với số lượng tham số tối thiểu. Sử dụng các phương thức SetX (input_value) để chỉ định các giá trị muốn set. class User { ... public void setAge ( age_in ) { age = age_in ; } } User hlong = new User ( " Dinh " , " Hoang Long " ) ; hlong . setAge (22) ; Dinh Hoang Long, Mental Log Builder Pattern 11/28
  • 16. Bài toán, vấn đề User Class Giải pháp: JavaBeans Convention Tạo 1 constructor không có tham số nào (0-argument constructor), hoặc 1 constructor duy nhất với số lượng tham số tối thiểu. Sử dụng các phương thức SetX (input_value) để chỉ định các giá trị muốn set. class User { ... public void setAge ( age_in ) { age = age_in ; } } User hlong = new User ( " Dinh " , " Hoang Long " ) ; hlong . setAge (22) ; Nhược điểm? Dinh Hoang Long, Mental Log Builder Pattern 11/28
  • 17. Bài toán, vấn đề User Class Nhược điểm Object được tạo ra trở nên không bền vững, dễ bị thay đổi. Dinh Hoang Long, Mental Log Builder Pattern 12/28
  • 18. Bài toán, vấn đề User Class Nhược điểm Object được tạo ra trở nên không bền vững, dễ bị thay đổi. Người sử dụng khó kiểm soát được trạng thái của object (Vì quá dễ bị thay đổi). Dinh Hoang Long, Mental Log Builder Pattern 12/28
  • 19. Bài toán, vấn đề User Class Nhược điểm Object được tạo ra trở nên không bền vững, dễ bị thay đổi. Người sử dụng khó kiểm soát được trạng thái của object (Vì quá dễ bị thay đổi). Giải pháp: Builder Pattern Dinh Hoang Long, Mental Log Builder Pattern 12/28
  • 20. Builder Pattern Ý tưởng cơ bản Ý tưởng cơ bản Builder Pattern Là 1 pattern dành cho việc tạo object (creational pattern) Dinh Hoang Long, Mental Log Builder Pattern 13/28
  • 21. Builder Pattern Ý tưởng cơ bản Ý tưởng cơ bản Builder Pattern Là 1 pattern dành cho việc tạo object (creational pattern) Builder pattern được sử dụng khi số lượng tham số cần thiết tạo 1 object là lớn (>4), hoặc quá trình tạo object phức tạp. Dinh Hoang Long, Mental Log Builder Pattern 13/28
  • 22. Builder Pattern Ý tưởng cơ bản Ý tưởng cơ bản Builder Pattern Là 1 pattern dành cho việc tạo object (creational pattern) Builder pattern được sử dụng khi số lượng tham số cần thiết tạo 1 object là lớn (>4), hoặc quá trình tạo object phức tạp. Builder pattern sử dụng 1 object có vai trò Builder, để tạo 1 object khác. Dinh Hoang Long, Mental Log Builder Pattern 13/28
  • 23. Builder Pattern Áp dụng vào bài toán Áp dụng vào bài toán Ý tưởng Tạo 1 class UserBuilder có vai trò tạo 1 object cho class User. Dinh Hoang Long, Mental Log Builder Pattern 14/28
  • 24. Builder Pattern Áp dụng vào bài toán Áp dụng vào bài toán Ý tưởng Tạo 1 class UserBuilder có vai trò tạo 1 object cho class User. Việc tạo object cho class User bị ràng buộc phải qua UserBuilder. Dinh Hoang Long, Mental Log Builder Pattern 14/28
  • 25. Builder Pattern Áp dụng vào bài toán Áp dụng vào bài toán Ý tưởng Tạo 1 class UserBuilder có vai trò tạo 1 object cho class User. Việc tạo object cho class User bị ràng buộc phải qua UserBuilder. Giải pháp: Nested Class Dinh Hoang Long, Mental Log Builder Pattern 14/28
  • 26. Builder Pattern Áp dụng vào bài toán UserBuilder Class class User { public static class UserBuilder () { private String first_name ; private String last_name ; private int age = 0; private String phone = " " ; private String address = " " ; public UserBuilder ( String first_name_in , String last_name_in ) { first_name = first_name_in ; last_name = last_name_in ; } } } Dinh Hoang Long, Mental Log Builder Pattern 15/28
  • 27. Builder Pattern Áp dụng vào bài toán UserBuilder Class class User { public static class UserBuilder () { private String first_name ; private String last_name ; private int age = 0; private String phone = " " ; private String address = " " ; public UserBuilder ( String first_name_in , String last_name_in ) { first_name = first_name_in ; last_name = last_name_in ; } public UserBuilder age ( int age_in ) { age = age_in ; return this ; } } } Dinh Hoang Long, Mental Log Builder Pattern 16/28
  • 28. Builder Pattern Áp dụng vào bài toán UserBuilder Class class User { public static class UserBuilder () { private String first_name ; private String last_name ; private int age = 0; private String phone = " " ; private String address = " " ; public UserBuilder ( String first_name_in , String last_name_in ) { first_name = first_name_in ; last_name = last_name_in ; } public UserBuilder age ( int age_in ) { age = age_in ; return this ; } public UserBuilder phone ( String phone_in ) { phone = phone_in ; return this ; } public UserBuilder address ( String address_in ) { address = address_in ; return this ; } } } Dinh Hoang Long, Mental Log Builder Pattern 17/28
  • 29. Builder Pattern Áp dụng vào bài toán UserBuilder Class class User { public static class UserBuilder () { private String first_name ; private String last_name ; private int age = 0; private String phone = " " ; private String address = " " ; public UserBuilder ( String first_name_in , String last_name_in ) { first_name = first_name_in ; last_name = last_name_in ; } public UserBuilder age ( int age_in ) { age = age_in ; return this ; } public UserBuilder phone ( String phone_in ) { phone = phone_in ; return this ; } public UserBuilder address ( String address_in ) { address = address_in ; return this ; } public User build () { return new User ( this ) ; } } } Dinh Hoang Long, Mental Log Builder Pattern 18/28
  • 30. Builder Pattern Áp dụng vào bài toán UserBuilder Class class User { private String first_name ; private String last_name ; private int age ; private String phone ; private String address ; public static class UserBuilder { ... } private User ( UserBuilder builder ) { first_name = builder . first_name ; last_name = builder . last_name ; age = builder . age ; phone = builder . phone ; address = builder . address ; } } Dinh Hoang Long, Mental Log Builder Pattern 19/28
  • 31. Builder Pattern Áp dụng vào bài toán UserBuilder Class class User { private String first_name ; private String last_name ; private int age ; private String phone ; private String address ; public static class UserBuilder { ... } private User ( UserBuilder builder ) { first_name = builder . first_name ; last_name = builder . last_name ; age = builder . age ; phone = builder . phone ; address = builder . address ; } } Sử dụng User hlong = new User . UserBuilder ( " dinh " , " hoang long " ) . age (23) . address ( " Hanoi " ) . build () ; Dinh Hoang Long, Mental Log Builder Pattern 19/28
  • 32. Builder Pattern Áp dụng vào bài toán UserBuilder Class Có nhất thiết phải sự dụng "nested class"? Điều gì xảy ra nếu sử dụng "outside class"? Dinh Hoang Long, Mental Log Builder Pattern 20/28
  • 33. Builder Pattern Áp dụng vào bài toán UserBuilder Class Có nhất thiết phải sự dụng "nested class"? Điều gì xảy ra nếu sử dụng "outside class"? Khi nào cần tạo 1 class builder riêng: Dinh Hoang Long, Mental Log Builder Pattern 20/28
  • 34. Builder Pattern Áp dụng vào bài toán UserBuilder Class Có nhất thiết phải sự dụng "nested class"? Điều gì xảy ra nếu sử dụng "outside class"? Khi nào cần tạo 1 class builder riêng: Công việc build các thành phần của product là phức tạp. Dinh Hoang Long, Mental Log Builder Pattern 20/28
  • 35. Builder Pattern Áp dụng vào bài toán UserBuilder Class Có nhất thiết phải sự dụng "nested class"? Điều gì xảy ra nếu sử dụng "outside class"? Khi nào cần tạo 1 class builder riêng: Công việc build các thành phần của product là phức tạp. Chỉ thông qua builder mới có thể tạo được các thành phần cho product. Dinh Hoang Long, Mental Log Builder Pattern 20/28
  • 36. Builder Pattern Phân tích các thành phần trong Builder Pattern Phân tích các thành phần trong Builder Pattern Hình 1: Sơ đồ UML đầy đủ của 1 Builder Pattern Dinh Hoang Long, Mental Log Builder Pattern 21/28
  • 37. Builder Pattern Phân tích các thành phần trong Builder Pattern Vai trò của các thành phần Builder Quản lý cách mà các thành phần của object sẽ được tạo ra (How part is built). Dinh Hoang Long, Mental Log Builder Pattern 22/28
  • 38. Builder Pattern Phân tích các thành phần trong Builder Pattern Vai trò của các thành phần Builder Quản lý cách mà các thành phần của object sẽ được tạo ra (How part is built). Director Quản lý cách mà các thành phần được lắp ráp, tháo bỏ (How to assemble part). Dinh Hoang Long, Mental Log Builder Pattern 22/28
  • 39. Builder Pattern Phân tích các thành phần trong Builder Pattern Vai trò của các thành phần Builder Quản lý cách mà các thành phần của object sẽ được tạo ra (How part is built). Director Quản lý cách mà các thành phần được lắp ráp, tháo bỏ (How to assemble part). Vai trò: Thông báo với builder khi nào 1 thành phần cần được tạo ra. Dinh Hoang Long, Mental Log Builder Pattern 22/28
  • 40. Builder Pattern Phân tích các thành phần trong Builder Pattern Vai trò của các thành phần Builder Quản lý cách mà các thành phần của object sẽ được tạo ra (How part is built). Director Quản lý cách mà các thành phần được lắp ráp, tháo bỏ (How to assemble part). Vai trò: Thông báo với builder khi nào 1 thành phần cần được tạo ra. Công việc của Director có thể thực hiện trực tiếp bởi client Dinh Hoang Long, Mental Log Builder Pattern 22/28
  • 41. Builder Pattern Phân tích các thành phần trong Builder Pattern Vai trò của các thành phần Builder Quản lý cách mà các thành phần của object sẽ được tạo ra (How part is built). Director Quản lý cách mà các thành phần được lắp ráp, tháo bỏ (How to assemble part). Vai trò: Thông báo với builder khi nào 1 thành phần cần được tạo ra. Công việc của Director có thể thực hiện trực tiếp bởi client → Có thể bỏ class Director, client có thể tự tạo object nhờ Builder. Dinh Hoang Long, Mental Log Builder Pattern 22/28
  • 42. Builder Pattern Phân tích các thành phần trong Builder Pattern Vai trò của các thành phần Builder Quản lý cách mà các thành phần của object sẽ được tạo ra (How part is built). Director Quản lý cách mà các thành phần được lắp ráp, tháo bỏ (How to assemble part). Vai trò: Thông báo với builder khi nào 1 thành phần cần được tạo ra. Công việc của Director có thể thực hiện trực tiếp bởi client → Có thể bỏ class Director, client có thể tự tạo object nhờ Builder. Khi nào cần Director? Dinh Hoang Long, Mental Log Builder Pattern 22/28
  • 43. Builder Pattern Phân tích các thành phần trong Builder Pattern Director Khi nào cần Director: Khi việc lắp ráp các thành phần của product là phức tạp. Không quá đơn giản hoặc không thể làm tùy ý. Dinh Hoang Long, Mental Log Builder Pattern 23/28
  • 44. Builder Pattern Phân tích các thành phần trong Builder Pattern Director Khi nào cần Director: Khi việc lắp ráp các thành phần của product là phức tạp. Không quá đơn giản hoặc không thể làm tùy ý. Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo ra 1 product) Dinh Hoang Long, Mental Log Builder Pattern 23/28
  • 45. Builder Pattern Phân tích các thành phần trong Builder Pattern Director Khi nào cần Director: Khi việc lắp ráp các thành phần của product là phức tạp. Không quá đơn giản hoặc không thể làm tùy ý. Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo ra 1 product) Quá trình lắp đặt là cố định Dinh Hoang Long, Mental Log Builder Pattern 23/28
  • 46. Builder Pattern Phân tích các thành phần trong Builder Pattern Director Khi nào cần Director: Khi việc lắp ráp các thành phần của product là phức tạp. Không quá đơn giản hoặc không thể làm tùy ý. Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo ra 1 product) Quá trình lắp đặt là cố định Nhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng gói quá trình tạo product. (Director lúc này chỉ cần làm việc với AbstractBuilder) Dinh Hoang Long, Mental Log Builder Pattern 23/28
  • 47. Builder Pattern Phân tích các thành phần trong Builder Pattern Director Khi nào cần Director: Khi việc lắp ráp các thành phần của product là phức tạp. Không quá đơn giản hoặc không thể làm tùy ý. Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo ra 1 product) Quá trình lắp đặt là cố định Nhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng gói quá trình tạo product. (Director lúc này chỉ cần làm việc với AbstractBuilder) Khi nào không cần Director Dinh Hoang Long, Mental Log Builder Pattern 23/28
  • 48. Builder Pattern Phân tích các thành phần trong Builder Pattern Director Khi nào cần Director: Khi việc lắp ráp các thành phần của product là phức tạp. Không quá đơn giản hoặc không thể làm tùy ý. Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo ra 1 product) Quá trình lắp đặt là cố định Nhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng gói quá trình tạo product. (Director lúc này chỉ cần làm việc với AbstractBuilder) Khi nào không cần Director Quá trình lắp đặt không cần thứ tự cụ thể Dinh Hoang Long, Mental Log Builder Pattern 23/28
  • 49. Builder Pattern Phân tích các thành phần trong Builder Pattern Director Khi nào cần Director: Khi việc lắp ráp các thành phần của product là phức tạp. Không quá đơn giản hoặc không thể làm tùy ý. Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạo ra 1 product) Quá trình lắp đặt là cố định Nhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng gói quá trình tạo product. (Director lúc này chỉ cần làm việc với AbstractBuilder) Khi nào không cần Director Quá trình lắp đặt không cần thứ tự cụ thể Quá trình lắp đặt cần nhiều tùy biến Dinh Hoang Long, Mental Log Builder Pattern 23/28
  • 50. Builder Pattern trong thực tế Builder Pattern trong thực tế Java StringBuilder PHP Zend_Db_Select Dinh Hoang Long, Mental Log Builder Pattern 24/28
  • 51. Builder Pattern trong thực tế Java StringBuilder Java StringBuilder String trong Java Không thể thay đổi Dinh Hoang Long, Mental Log Builder Pattern 25/28
  • 52. Builder Pattern trong thực tế Java StringBuilder Java StringBuilder String trong Java Không thể thay đổi Mỗi thao tác chèn ký tự, xóa ký tự, đổi chữ hoa thành chữ thường,... đều tạo ra object mới → Tốn bộ nhớ! Dinh Hoang Long, Mental Log Builder Pattern 25/28
  • 53. Builder Pattern trong thực tế Java StringBuilder Java StringBuilder StringBuilder trong Java Dễ dàng thực hiện các thao tác chèn, xóa,... đối với String. Dinh Hoang Long, Mental Log Builder Pattern 26/28
  • 54. Builder Pattern trong thực tế Java StringBuilder Java StringBuilder StringBuilder trong Java Dễ dàng thực hiện các thao tác chèn, xóa,... đối với String. Sử dụng phương thức toString để tạo ra String cuối cùng (Giống với phương thức getResult() trong mô hình của Builder Pattern). Dinh Hoang Long, Mental Log Builder Pattern 26/28
  • 55. Builder Pattern trong thực tế Java StringBuilder Java StringBuilder StringBuilder trong Java Dễ dàng thực hiện các thao tác chèn, xóa,... đối với String. Sử dụng phương thức toString để tạo ra String cuối cùng (Giống với phương thức getResult() trong mô hình của Builder Pattern). Ví dụ: String orgStr = " hello " ; StringBuilder builder = new StringBuilder () ; builder . append ( orgStr ) ; builder . deleteCharAt ( orgStr . length () -1) . insert (0 , " a " ) ; System . out . println ( builder . toString () ) ; // output : ahell Dinh Hoang Long, Mental Log Builder Pattern 26/28
  • 56. Builder Pattern trong thực tế Java StringBuilder Java StringBuilder Nhận xét về StringBuilder Lợi thế hơn String vì không phải tạo object mới. →Sử dụng khi muốn thay đổi 1 String. Tạo object bằng: new StringBuilder (String s) Dinh Hoang Long, Mental Log Builder Pattern 27/28
  • 57. Builder Pattern trong thực tế Java StringBuilder Java StringBuilder Nhận xét về StringBuilder Lợi thế hơn String vì không phải tạo object mới. →Sử dụng khi muốn thay đổi 1 String. Tạo object bằng: new StringBuilder (String s) Lợi thế hơn StringBuffer vì không cần bảo đảm thread-safety (không synchronization, nhanh hơn StringBuffer). Dinh Hoang Long, Mental Log Builder Pattern 27/28
  • 58. Builder Pattern trong thực tế PHP Zend_Db_Select PHP Zend_Db_Select Zend_Db_Select: Tạo 1 câu truy vấn MySQL Dinh Hoang Long, Mental Log Builder Pattern 28/28
  • 59. Builder Pattern trong thực tế PHP Zend_Db_Select PHP Zend_Db_Select Zend_Db_Select: Tạo 1 câu truy vấn MySQL Ví dụ: // Z e n d _ D b _ A d a p t e r _ P d o : $db $select = new Zend_Db_Select ( $db ) ; $select - > from ( " user " ) -> where ( " user_id > 10 " ) -> order ( " user_id DESC " ) -> limit (10) ; Dinh Hoang Long, Mental Log Builder Pattern 28/28
  • 60. Builder Pattern trong thực tế PHP Zend_Db_Select PHP Zend_Db_Select Zend_Db_Select: Tạo 1 câu truy vấn MySQL Ví dụ: // Z e n d _ D b _ A d a p t e r _ P d o : $db $select = new Zend_Db_Select ( $db ) ; $select - > from ( " user " ) -> where ( " user_id > 10 " ) -> order ( " user_id DESC " ) -> limit (10) ; // $stmt : Z e n d _ D b _ S t a t e m e n t $stmt = $select - > query () ; Dinh Hoang Long, Mental Log Builder Pattern 28/28
  • 61. Builder Pattern trong thực tế PHP Zend_Db_Select PHP Zend_Db_Select Zend_Db_Select: Tạo 1 câu truy vấn MySQL Ví dụ: // Z e n d _ D b _ A d a p t e r _ P d o : $db $select = new Zend_Db_Select ( $db ) ; $select - > from ( " user " ) -> where ( " user_id > 10 " ) -> order ( " user_id DESC " ) -> limit (10) ; // $stmt : Z e n d _ D b _ S t a t e m e n t $stmt = $select - > query () ; Tương ứng với: SELECT ∗ FROM user WHERE user _id > 10 ORDER BY user _id DESC LIMIT 10; Dinh Hoang Long, Mental Log Builder Pattern 28/28
  • 62. Builder Pattern trong thực tế PHP Zend_Db_Select PHP Zend_Db_Select Zend_Db_Select: Tạo 1 câu truy vấn MySQL Ví dụ: // Z e n d _ D b _ A d a p t e r _ P d o : $db $select = new Zend_Db_Select ( $db ) ; $select - > from ( " user " ) -> where ( " user_id > 10 " ) -> order ( " user_id DESC " ) -> limit (10) ; // $stmt : Z e n d _ D b _ S t a t e m e n t $stmt = $select - > query () ; Tương ứng với: SELECT ∗ FROM user WHERE user _id > 10 ORDER BY user _id DESC LIMIT 10; Không dùng builder pattern !!! class Ze nd_Db_Select { public function _construct ( $table_name , $where = " " , $order = " " , $limit = " " ,...) {} } Dinh Hoang Long, Mental Log Builder Pattern 28/28