Nếu lớp phụ thuộc vào một hoặc nhiều tài nguyên bên trong và các tài nguyên này ảnh hưởng đến hoạt động của lớp, thì không nên sử dụng Singleton và lớp tiện ích tĩnh.
Lớp không nên tự tạo ra các tài nguyên này, thay vào đó, tốt hơn hết là nên truyền các tài nguyên cần thiết vào hàm tạo. Tiêm phụ thuộc cho phép cải thiện tính linh hoạt, khả năng tái sử dụng và khả năng kiểm thử của lớp.
Ví dụ
Ví dụ về lớp tiện ích tĩnh
Lớp tiện ích này giả định rằng chỉ sử dụng một từ điển. Tuy nhiên, trong thực tế, có thể có các từ điển riêng biệt cho từng ngôn ngữ, thậm chí có cả từ điển riêng cho các thuật ngữ chuyên ngành.
Ví dụ về lớp Singleton
Tương tự như lớp tiện ích, lớp Singleton cũng giả định rằng chỉ sử dụng một từ điển, do đó dẫn đến cùng một nhược điểm như trên.
Giải pháp 1 - Loại bỏ từ khóa final khỏi trường
Bạn có thể loại bỏ từ khóa final khỏi trường dictionary của lớp tiện ích tĩnh hoặc lớp Singleton và thiết kế để dictionary có thể được thay thế bằng một từ điển khác từ bên ngoài. Tuy nhiên, phương pháp này khó sử dụng và có thể gây ra các vấn đề về đồng bộ trong môi trường đa luồng.
Giải pháp 2 - Sử dụng tiêm phụ thuộc
Thông qua ví dụ này, chúng ta có thể nhận thấy rằng các lớp tĩnh và lớp Singleton không nên phụ thuộc vào các tài nguyên bên trong. Nói cách khác, tốt hơn hết là nên nhận các tài nguyên bên trong từ bên ngoài.
Các lớp sử dụng tiêm phụ thuộc có thể đảm bảo tính bất biến nhờ từ khóa final và hỗ trợ nhiều phiên bản tài nguyên. Ngoài ra, tiêm phụ thuộc có thể được áp dụng không chỉ trong hàm tạo mà còn trong các nhà máy tĩnh và trình xây dựng.
Tiêm phụ thuộc không chỉ đơn giản là truyền tài nguyên mà còn thường sử dụng phương pháp truyền nhà máy tài nguyên. Nhà máy là một đối tượng tạo ra các phiên bản của một loại cụ thể khi được gọi. Phương pháp này được gọi là mẫu phương thức nhà máy và Supplier<T> trong Java 8 là một ví dụ hoàn hảo về cách thể hiện nhà máy.
Thường thì kiểu thẻ hoang dã giới hạn được sử dụng để giới hạn tham số kiểu của nhà máy. Bằng cách này, khách hàng có thể truyền bất kỳ nhà máy nào miễn là nó là kiểu con của kiểu được khách hàng chỉ định.
Tiêm phụ thuộc cải thiện tính linh hoạt và khả năng kiểm thử, nhưng có thể tốn kém trong các dự án có rất nhiều phụ thuộc. Trong những trường hợp này, bạn có thể sử dụng khung tiêm phụ thuộc (Dagger, Guice, Spring, v.v.) để giảm chi phí.
Bình luận0