Design Pattern - Factory Pattern (Part 2)

Ở bài viết trước, tôi đã giới thiệu với bạn ví dụ về cách sử dụng Factory Pattern trong Java. Ở bài viết này chúng ta sẽ đi sâu một chút để tìm hiểu kỹ xem Factory pattern có lợi ích gì khi sử dụng? Khi nào thì ta có thể dùng nó?

Bài trước: Design Pattern - Factory Pattern - (Part 1)

Kiến trúc

Dưới đây là biểu đồ class cho ví dụ ở phần trước:

Screen Shot 2016-10-07 at 3.48.00 PM.png

Ở hình trên ta có thể thấy có 3 Class Honda, NexusToyota đều được implements từ Class Car. Cả 3 class này đều là con của class Car nên nó thừa hưởng tất cả các tính chất của Car và phải override lại phương thức view() của Car. Tuy nó có chung phương thức nhưng chúng ta có thể định nghĩa khác nhau cho nó. Hiểu đơn giản là bạn đến cửa hàng Honda để bạn xem xe của hãng Honda chứ không phải xem của Nexus hay Toyota. Và 2 cửa hàng kia cũng vậy. Cho nên Chúng ta phải viết nội dung của phương thức view() khác nhau cho từng Class con.

Tưởng tượng class Boss chính là bạn. Bạn muốn đi xem các hãng ô tô khác nhau mà không muốn đi tới từng cửa hàng khác nhau. Vậy thì phải làm thế nào? Đừng lo, đã có CarFactory =)). CarFactory đơn giản giống như là 1 cửa hàng có bán nhiều loại xe, bạn chỉ việc tới đó và xem các loại ô tô khác nhau mà không cần phải đi lại nhiều. Hoặc cách hiểu khác thì CarFactory giống như 1 thằng môi giới đi mồi chài bạn. Nó có các kiến thức để tư vấn cho bạn về các loại xe mà bạn quan tâm 😃. Đó là tất cả những gì có ở hình trên 😃.

Định nghĩa

Factory method, đầy đủ là Factory method pattern, là thiết kế mẫu hướng đối tượng trong việc thiết kế phần mềm cho máy tính, nhằm giải quyết vấn đề tạo một đối tượng mà không cần thiết chỉ ra một cách chính xác lớp nào sẽ được tạo. Factory method giải quyết vấn đề này bằng cách định nghĩa một phương thức cho việc tạo đối tượng, và các lớp con thừa kế có thể override để chỉ rõ đối tượng nào sẽ được tạo. Nói chung, "factory method" thường được áp dụng cho những phương thức mà nhiệm vụ chính của nó là tạo ra đối tượng. (Nguồn: Wikipedia =)) )

Tại sao lại phải dùng Factory pattern thay cho việc khởi tạo đối tượng thông thường? Dùng Factory pattern có lợi ích gì?

Factory pattern đưa ra 1 ý tưởng mới cho việc khởi tạo các instance phù hợp với mỗi request từ phía Client. Sử dụng Factory pattern sẽ có những ưu điểm sau:

  • Tạo ra 1 cách mới trong việc khởi tạo cá Object thông qua 1 interface chung.

  • Khởi tạo các Objects mà che giấu đi xử lí logic của việc khởi tạo đấy.

  • Giảm sự phụ thuộc giữa các module, các logic với các class cụ thể, mà chỉ phụ thuộc vào interface hoặc abstract class.

Vậy thì khi nào chúng ta nên sử dụng Factory pattern?

Dựa vào lợi ích của việc sử dụng Factory pattern mà ta sẽ dùng chúng với một số mục đích sau:

  • Tạo ra 1 cách mới trong việc khởi tạo Object => Hiển nhiên.
  • Che giấu xử lý logic của việc khởi tạo => Trong trường hợp bạn đang muốn viết 1 thư viện để người khác sử dụng.
  • Giảm sự phụ thuộc => Dễ dàng cho việc mở rộng trong trường hợp bạn chưa biết chắc số lượng đối tượng (Honda, Nexus, Toyota) là đã đủ cho bài toán của mình chưa. Vì khi bạn thêm vào thì phía trên (class Boss) không cần phải sửa gì thêm, chỉ là thay đổi ở phía dưới thôi 😉.

Tạm kết

Còn chần chờ gì nữa. Hãy áp dụng Factory pattern vào project của bạn ngay thôi (ahihi).

Trong phạm vi kiến thức của tôi thì chỉ chia sẻ cho bạn được tới đó thôi. Hi vọng trong tương lai tôi có thể chia sẻ thêm cho bạn sâu hơn nữa kiến thức về Factory pattern. Mong rằng bài viết sẽ mang đến một chút kiến thức cho bạn. Xin cảm ơn!