Go – Factory Pattern

Factory pattern là pattern thường được sử dụng trong ngôn ngữ lập trình hướng đối tượng. Trong Go có rất nhiều cách khác nhau trong đó bạn có thể dùng Factory Pattern để làm cho code của bạn trở nên sạch hơn và ngắn gọn hơn.

Go không có class nhưng chúng ta có thể sử dụng struct. Ví dụ struct của Person, cùng với phương thức Greet sẽ như sau

Factory đơn giản

Cách đơn giản và phổ biến nhất thường được sử dụng là một hàm nhận các số tham số đầu vào và trả về instance Person

Chúng ta cũng có thể trả về con trỏ Person như sau

Các hàm Factory thay thế tốt hơn cho việc khởi tạo các instance  sử dụng như p := &Person{}, bởi vì ký hiệu của hàm đảm bảo rằng tất cả mọi người sẽ cung cấp các thuộc tính yêu cầu. Ví dụ, một người có thể dễ dàng quên việc khởi tạo thuộc tính Age khi sử dụng struct để khởi tạo. Ký hiệu hàm là NewPerson(name string, age int) đảm bảo rằng cả nameage được cung cấp để có thể tạo một Person mới.

Interface factory

Hàm Factory có thể trả về một interface thay vì một struct. Interface cho phép định nghĩa các hành vi (behavior) mà không cần đưa ra các thực thi bên trong. Điều này nghĩa là chúng ta có thể tạo một private struct, trong khi chỉ để lộ interface (ở đây là các hành vi) ra bên ngoài.

Do con trỏ cũng có thể thực thi các interface, chúng ta có thể trả về hàm giống nhau với con trỏ thay thế

Nhiều phần thực thi

Bằng việc trả về các interface, chúng ta có thể có nhiều hàm Factory trả về các thực thi khác nhau của các interface. Một trường hợp sử dụng thực tế dùng để sinh ra các mock. Ví dụ, chúng ta có thể tạo một interface Doer, http client thực thi và tạo một hàm Factory để trả về mock http client.

Do NewHTTPClientNewMockHTTPClient cả hai cùng trả về một kiểu, chúng có thể được sử dụng hoán đổi cho nhau, điều này thực sự hữu ích bạn muốn test code sử dụng Http client mà không cần tạo bất kỳ cuộc gọi HTTP ra bên ngoài.

 Factory Generator

Facetory Generator tức là Factory của Factory. Mặc dù nghe có vẻ hơi phức tạp, nhưng Factory Generator là vô cùng hữu ích, khi bạn muốn khởi tạo các instance của các struct khác nhau hoặc các interface không loại trừ lẫn nhau, hoặc bạn muốn nhiều Factory với các giá trị mặc định khác nhau

Phương thức Factory

Chúng ta có thể sử dụng các phương thức của struct Factory Generator. Ví dụ, xem xét một animal factory mà tạo các instance của một animal và cũng là nơi nuôi động vật.

Tiếp theo, chúng ta có thể tạo Factory Dog và Factory Horse sử dụng Generator AnimalFactory

Hàm Factory

Chúng ta có thể sử dụng hàm Factory để tạo ra các Factory với một vài mặc định được tích hợp sẵn. Ví dụ chúng ta muốn tạo một Baby Factory và Teenager Factory thay vì tạo một Person Factory chung, chúng ta sử dụng hàm Generator

Chúng ta sử dụng hàm này để tạo các Factory với age mặc định được tích hợp sẵn

Thuộc tính age được trừu tượng hoá trong đóng gói NewPersonFactory

Khi nào không nên sử dụng Factory

Factory có thể sử dụng một cách lạm dụng. Nếu bạn đang khởi tạo một struct, giá trị mặc định của Go cũng phù hợp trong hầu hết các trường hợp, thì Factory không thực sự hữu ích. Giả sử nếu bạn muốn tạo một counter

Giá trị mặc định của c.count là 0, về cơ bản là chấp nhận được. Tạo một hàm Factory sẽ không mang lại nhiều giá trị

 

You May Also Like

About the Author: Nguyen Dinh Thuc

Leave a Reply

avatar
  Subscribe  
Notify of