Download pdf - Builder Pattern

Transcript

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ánPhân tích các thành phần trong Builder Pattern

Builder Pattern trong thực tế

Java: StringBuilerPHP: 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ỏ

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 đề

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 , 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 , "");

}

Dinh Hoang Long, Mental Log Builder Pattern 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: PHPpublic 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ếtnhiề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

Nhược điểm:

Khi số lượng tham số nhiều lên thì số lượng Constructor cần viếtnhiề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

Nhược điểm:

Khi số lượng tham số nhiều lên thì số lượng Constructor cần viếtnhiề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.

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

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

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.

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

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

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)

Builder pattern được sử dụng khi số lượng tham số cần thiết tạo 1object 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 objectkhác.

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 1object 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 objectkhác.

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 1object 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 objectkhá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.

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

Á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

Á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;

}

}

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

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"?

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 choproduct.

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 choproduct.

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 choproduct.

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 choproduct.

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).

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

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

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

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

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

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 ý.

Khi cần tạo cố định 1 kiểu product. (1 Director với 1 Builder chỉ tạora 1 product)

Quá trình lắp đặt là cố địnhNhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng góiquá 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 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ạora 1 product)

Quá trình lắp đặt là cố địnhNhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng góiquá 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 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ạora 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óiquá 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 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ạora 1 product)

Quá trình lắp đặt là cố địnhNhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng góiquá 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 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ạora 1 product)

Quá trình lắp đặt là cố địnhNhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng góiquá 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 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ạora 1 product)

Quá trình lắp đặt là cố địnhNhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng góiquá 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 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ạora 1 product)

Quá trình lắp đặt là cố địnhNhiều Builder cùng thừa kế 1 AbstractBuilder, Director cần đóng góiquá 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

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

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.

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ủaBuilder 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

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ủaBuilder 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

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ủaBuilder 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)

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ế 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

Ví dụ:// Zend_Db_Adapter_Pdo : $db

$select = new Zend_Db_Select($db);

$select ->from("user")

->where("user_id > 10")

->order("user_id DESC")

->limit (10);

// $stmt: Zend_Db_Statement

$stmt = $select ->query();

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

Không dùng builder pattern !!!

class Zend_Db_Select{

public function _construct($table_name , $where = "", $order = "", $limit = "" ,...){}

}

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 MySQLVí dụ:// Zend_Db_Adapter_Pdo : $db

$select = new Zend_Db_Select($db);

$select ->from("user")

->where("user_id > 10")

->order("user_id DESC")

->limit (10);

// $stmt: Zend_Db_Statement

$stmt = $select ->query();

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

Không dùng builder pattern !!!

class Zend_Db_Select{

public function _construct($table_name , $where = "", $order = "", $limit = "" ,...){}

}

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 MySQLVí dụ:// Zend_Db_Adapter_Pdo : $db

$select = new Zend_Db_Select($db);

$select ->from("user")

->where("user_id > 10")

->order("user_id DESC")

->limit (10);

// $stmt: Zend_Db_Statement

$stmt = $select ->query();

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

Không dùng builder pattern !!!

class Zend_Db_Select{

public function _construct($table_name , $where = "", $order = "", $limit = "" ,...){}

}

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 MySQLVí dụ:// Zend_Db_Adapter_Pdo : $db

$select = new Zend_Db_Select($db);

$select ->from("user")

->where("user_id > 10")

->order("user_id DESC")

->limit (10);

// $stmt: Zend_Db_Statement

$stmt = $select ->query();

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

Không dùng builder pattern !!!

class Zend_Db_Select{

public function _construct($table_name , $where = "", $order = "", $limit = "" ,...){}

}

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 MySQLVí dụ:// Zend_Db_Adapter_Pdo : $db

$select = new Zend_Db_Select($db);

$select ->from("user")

->where("user_id > 10")

->order("user_id DESC")

->limit (10);

// $stmt: Zend_Db_Statement

$stmt = $select ->query();

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

Không dùng builder pattern !!!

class Zend_Db_Select{

public function _construct($table_name , $where = "", $order = "", $limit = "" ,...){}

}

Dinh Hoang Long, Mental Log Builder Pattern 28/28