Builder Pattern

Builder Pattern

Builder Pattern được giới thiệu để giải quyết một số vấn đề của Factory Pattern khi gặp phải vấn đề đối tượng chứa nhiều thuộc tính. Những lý do chính được liệt kê như sau:

  1. Có quá nhiều tham số được truyền vào lớp Factory mà có thể gây ra lỗi bởi quá trình truyền không thể giữ được trật tự (thứ tự) của các tham số.
  2. Một số tham số có thể là tùy chọn, nhưng với Factory Pattern tất cả các tham số đều phải được truyền vào đầy đủ.
  3. Nếu đối tượng lớn và quá trình khởi tạo phức tạp, thì tất cả sự phức tạp này sẽ đổ lên lớp Factory.
Những vấn đề này có thể được giải quyết bằng cách cung cấp một bộ tạo với các tham số bắt buộc và các phương thức setter để thiết lập các tham số tùy chọn.


1. Builder Design Pattern trong Java

  1. Đầu tiên chúng ta cần tạo ra một lớp lồng tĩnh (static nested class) và rồi sao chép tất cả các tham số từ lớp bên ngoài vào lớp Builder. Chhungs ta cần đặt tên theo quy chuẩn.
  2. Lớp Builder cần có một phương thức khởi tạo ở chế độ public với tất cả các tham số bắt buộc.
  3. Lớp Builder cần có các phương thức set để thiết lập các tham số tùy chọn.
  4. Và nó cần có một phương thức build() để trả về đối tượng cần thiết.
Ví dụ sau mô tả cách thức xây dựng và hoạt động của Builder Pattern.

package com.journaldev.design.builder;

public class Computer {
 
 //required parameters
 private String HDD;
 private String RAM;
 
 //optional parameters
 private boolean isGraphicsCardEnabled;
 private boolean isBluetoothEnabled;
 

 public String getHDD() {
  return HDD;
 }

 public String getRAM() {
  return RAM;
 }

 public boolean isGraphicsCardEnabled() {
  return isGraphicsCardEnabled;
 }

 public boolean isBluetoothEnabled() {
  return isBluetoothEnabled;
 }
 
 private Computer(ComputerBuilder builder) {
  this.HDD=builder.HDD;
  this.RAM=builder.RAM;
  this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;
  this.isBluetoothEnabled=builder.isBluetoothEnabled;
 }
 
 //Builder Class
 public static class ComputerBuilder{

  // required parameters
  private String HDD;
  private String RAM;

  // optional parameters
  private boolean isGraphicsCardEnabled;
  private boolean isBluetoothEnabled;
  
  public ComputerBuilder(String hdd, String ram){
   this.HDD=hdd;
   this.RAM=ram;
  }

  public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
   this.isGraphicsCardEnabled = isGraphicsCardEnabled;
   return this;
  }

  public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
   this.isBluetoothEnabled = isBluetoothEnabled;
   return this;
  }
  
  public Computer build(){
   return new Computer(this);
  }

 }

}


Mã lệnh sử dụng Builder pattern ở trên như sau:

package com.journaldev.design.test;

import com.journaldev.design.builder.Computer;

public class TestBuilderPattern {

 public static void main(String[] args) {
  //Using builder to get the object in a single line of code and 
                //without any inconsistent state or arguments management issues  
  Computer comp = new Computer.ComputerBuilder(
    "500 GB", "2 GB").setBluetoothEnabled(true)
    .setGraphicsCardEnabled(true).build();
 }

}

No comments :

Post a Comment