Trong bài viết này, chúng ta sẽ tiếp tục với một cuộc đua giữa các loài động vật sử dụng Builder Design Pattern trong Java. Chúng ta sẽ đi qua từng bước cụ thể để xây dựng các lớp 'Animal', và tái sử dụng lại 'AnimalController' và 'TestAnimal', và sau đó, chúng ta sẽ phân tích ưu và nhược điểm của Builder Design Pattern.
Xây Dựng Lớp 'Animal' với Builder Design Pattern
Lớp 'Animal' sẽ đại diện cho mỗi loài động vật tham gia cuộc đua. Chúng ta sẽ sử dụng Builder Design Pattern để tạo ra các đối tượng 'Animal' với các thuộc tính tùy chọn như tên, tốc độ và khả năng bay.
public class Animal {
private String name;
private int speed;
private boolean isFly;
public Animal() {
}
public String getName() {
return name;
}
public int getSpeed() {
return speed;
}
public boolean isFly() {
return isFly;
}
public static class Builder {
private String name = null;
private int speed = 0;
private boolean isFly = false;
public Builder() {
}
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setSpeed(int speed) {
this.speed = speed;
return this;
}
public Builder setFly(boolean fly) {
isFly = fly;
return this;
}
public Animal build(){
Animal animal = new Animal();
animal.name = this.name;
animal.speed = this.speed;
animal.isFly = this.isFly;
return animal;
}
}
@Override
public String toString() {
return name + " {" +
"speed= " + speed +
", flyAble= " + isFly +
'}';
}
}
Tái sử dụng lại lớp 'AnimalController'
Các bài trước, 2 lớp này đã được khởi tạo, nên hãy tham khảo thêm nhé.
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AnimalController {
public void winnerSpeedWithoutWings(List<Animal> animalList){
Map<Integer, String> mapAnimal = new HashMap<>();
for (Animal animal : animalList) {
mapAnimal.put(animal.getSpeed(), animal.getName());
}
int maxSpeed = Collections.max(mapAnimal.keySet());
for (Map.Entry<Integer, String> entry : mapAnimal.entrySet()) {
if(entry.getKey() == maxSpeed){
System.out.printf("Winner is %s, with the speed is %d", entry.getValue(), entry.getKey());
break;
}
}
}
}
Lớp 'TestAnimal'
import java.security.SecureRandom;
import java.util.Arrays;
public class TestAnimal {
public static void main(String[] args) {
Animal horse = new Animal.Builder().setName("Horse").setSpeed(new SecureRandom().nextInt(100)).build();
System.out.println(horse.toString());
Animal dog = new Animal.Builder().setName("Dog").setSpeed(new SecureRandom().nextInt(50)).build();
System.out.println(dog.toString());
Animal eagle = new Animal.Builder().setName("Eagle").setSpeed(new SecureRandom().nextInt(100)).setFly(true).build();
System.out.println(eagle.toString());
Animal duck = new Animal.Builder().setName("Eagle").setSpeed(new SecureRandom().nextInt(50)).setFly(true).build();
System.out.println(duck.toString());
Animal lion = new Animal.Builder().setName("Dog").setSpeed(new SecureRandom().nextInt(100)).build();
System.out.println(lion.toString());
AnimalController animalController = new AnimalController();
animalController.winnerSpeedWithoutWings(Arrays.asList(horse, dog, eagle, duck, lion));
}
}
Kết Luận
Ưu Điểm:
Linht Hoạt và Mở Rộng: Builder Pattern cho phép chúng ta tạo ra các đối tượng phức tạp với các thuộc tính tùy chọn một cách linh hoạt và dễ dàng mở rộng.
Dễ Đọc và Dễ Sử Dụng: Cấu trúc của Builder Pattern làm cho mã nguồn trở nên dễ đọc và dễ sử dụng hơn, đặc biệt khi có nhiều thuộc tính tùy chọn.
Nhược Điểm:
Đòi Hỏi Nhiều Công Việc: Việc triển khai Builder Pattern yêu cầu việc tạo ra một lớp Builder riêng biệt cho mỗi lớp cần được xây dựng, điều này có thể tạo ra sự phức tạp trong mã nguồn.
Tăng Số Lượng Lớp: Sử dụng Builder Pattern có thể dẫn đến tăng số lượng lớp trong dự án, điều này có thể làm tăng khối lượng công việc và quản lý mã nguồn.
Trên đây là cách sử dụng Builder Design Pattern trong việc xây dựng một cuộc đua giữa các loài động vật. Mặc dù có nhược điểm nhất định, nhưng Builder Pattern vẫn là một công cụ mạnh mẽ để tạo ra các đối tượng phức tạp trong lập trình Java.
Comments