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