Trong một số mã của tôi, tôi có một nhà máy tĩnh tương tự như sau:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
Trong quá trình xem xét mã, nó đã được đề xuất rằng đây phải là một singleton và được tiêm. Vì vậy, nó sẽ trông như thế này:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
Một vài điều cần làm nổi bật:
- Cả hai nhà máy đều không quốc tịch.
- Sự khác biệt duy nhất giữa các phương thức là phạm vi của chúng (thể hiện so với tĩnh). Việc thực hiện là như nhau.
- Foo là một bean không có giao diện.
Các đối số tôi có để đi tĩnh là:
- Lớp không trạng thái, do đó không cần phải được khởi tạo
- Có vẻ tự nhiên hơn khi có thể gọi một phương thức tĩnh hơn là phải khởi tạo một nhà máy
Các đối số cho nhà máy là một đơn vị là:
- Nó tốt để tiêm tất cả mọi thứ
- Bất chấp sự không quốc tịch của nhà máy, thử nghiệm dễ dàng hơn bằng cách tiêm (dễ giả)
- Nó nên bị chế giễu khi kiểm tra người tiêu dùng
Tôi có một số vấn đề nghiêm trọng với cách tiếp cận đơn lẻ vì dường như nó gợi ý rằng không có phương pháp nào nên tĩnh. Nó dường như cũng gợi ý rằng các tiện ích như StringUtils
nên được bọc và tiêm, có vẻ ngớ ngẩn. Cuối cùng, điều đó ngụ ý rằng tôi sẽ cần phải chế giễu nhà máy tại một số điểm, điều này có vẻ không đúng. Tôi không thể nghĩ đến khi nào tôi cần chế giễu nhà máy.
Cộng đồng nghĩ gì? Mặc dù tôi không thích cách tiếp cận đơn lẻ, tôi dường như không có một cuộc tranh cãi mạnh mẽ nào chống lại nó.
DateTime
và File
các lớp nổi tiếng là khó kiểm tra vì những lý do chính xác giống nhau. Nếu bạn có một lớp, ví dụ, đặt Created
ngày thành DateTime.Now
trong hàm tạo, làm thế nào để bạn tạo một bài kiểm tra đơn vị với hai trong số các đối tượng này được tạo cách nhau 5 phút? Những năm xa nhau thì sao? Bạn thực sự không thể làm như vậy (không có nhiều công việc).
private
xây dựng và một getInstance()
phương pháp? Xin lỗi, không thể chọn nit-pick!