Nhân bản dễ dàng

Nếu đã từng lập trình java, c# chắc hẳn chúng ta đã quen với hàm clone rồi đúng không? Đó chính là ví dụ kinh điển nhất của Prototype design pattern:

Object clonedObject = object.clone();

Giới thiệu

Các tính năng duplicate file gần như là mặc định trên các giao diện của hệ điều hành hay các công cụ chúng ta vẫn dùng hàng ngày. Nếu như cứ mỗi lần để tạo ra 1 đối tượng y chang, chúng ta lại phải đi tạo mới rồi set cài đặt thuộc tính cho nó thì sẽ tương đối vất vả và mất thời gian code, đặc biệt với các đối tượng phức tạp. Vậy nên trong trường hợp này, Prototype pattern sẽ là viên đạn bạc cho chúng ta.

Mục tiêu

Prototype pattern ra đời với mục tiêu:

  • Tạo ra 1 đối tượng y hiện đối tượng mẫu
  • Quy định kiểu của đối tượng được tạo ra

Ví dụ

Chúng ta sẽ lấy ví dụ về động vật, có 2 loại đó là Bird và Fish cùng thừa kế lớp cha là Animal:

@Data
public static class Animal implements Cloneable {
    private String name;
    private int age;

    @Override
    public Animal clone() {
        final Animal animal = new Animal();
        cloneProperties(animal);
        return animal;
    }

    protected void cloneProperties(Animal animal) {
        animal.setName(name);
        animal.setAge(age);
    }
}

@Data
public static class Bird extends Animal {
    private int maxFlyTime;

    @Override
    public Bird clone() {
        final Bird bird = new Bird();
        bird.setMaxFlyTime(maxFlyTime);
        cloneProperties(bird);
        return bird;
    }
}

@Data
public static class Fish extends Animal {
    private String preferWater;

    @Override
    public Fish clone() {
        final Fish fish = new Fish();
        fish.setPreferWater(preferWater);
        cloneProperties(fish);
        return fish;
    }
}

Và khi sử dụng sẽ thế này:

final Bird bird = new Bird();
bird.setAge(1);
bird.setName("bird");
bird.setMaxFlyTime(10);
final Animal cloneBird = bird.clone();

final Fish fish = new Fish();
fish.setAge(3);
fish.setName("fish");
fish.setPreferWater("sea");
final Animal cloneFish = fish.clone();

Chúng ta có thể thấy hai đối tượng ban đầu là bird và fish được tạo ra khá phức tạp khi phải set khá nhiều trường dữ liệu, nhưng những đối tượng được clone thì lại không cần thiết vậy nên công sức sẽ được giảm đi rất nhiều.

Kết luận

Tính năng clone thường khá phổ biến, và với Prototype pattern sẽ giúp chúng ta tiết kiệm được rất nhiều công sức vậy nên đừng quên sử dụng nó khi chúng ta cần nhé.