Mẫu thiết kế nhà máy được sử dụng để ẩn logic triển khai đằng sau nhà máy đối tượng và quyền lực của nó là sử dụng thừa kế để đạt được điều này. Giả sử bạn sẽ có nhiều loại người, ví dụ: một SmartPerson và một DumbPerson (thực hiện cùng một lớp cơ sở Person). Người ta có thể yêu cầu nhà máy tạo ra một người thông minh hoặc ngu ngốc mà không bao giờ biết về sự khác biệt thực hiện, vì tất cả nó đều trả về là một đối tượng Person.
Bạn có thể khởi tạo một người có hàm tham chiếu đến hàm tạo, nhưng mẫu này là về vị trí tạo đối tượng, cho phép bạn ẩn một số logic thực hiện nhất định.
Việc ẩn logic đằng sau nhà máy giúp bạn tiết kiệm rất nhiều thời gian trong tương lai, nơi các lớp khác nhau có thể sử dụng nhà máy để tạo người, vì thay đổi cách bạn tạo người sẽ chỉ yêu cầu bạn sửa đổi phương thức tạo trong nhà máy và không ảnh hưởng đến từng loại cá nhân sử dụng nhà máy.
@Test
public void testSimpleFactory() {
PersonFactory personFactory = new PersonFactory();
Person person = personFactory.createPerson("dumb");
person.doMath(); // prints 1 + 1 = 3
}
public class PersonFactory {
public Person createPerson(String characteristic) {
switch (characteristic) {
case "smart":
return new SmartPerson();
case "dumb":
return new DumbPerson();
default:
return null;
}
}
}
public interface Person {
void doMath();
}
public class SmartPerson implements Person {
@Override
public void doMath() {
System.out.println("1 + 1 = 2");
}
}
public class DumbPerson implements Person {
@Override
public void doMath() {
System.out.println("1 + 1 = 3");
}
}
Nguồn
2017-01-28 13:47:58
Chắc chắn, tại sao không? Mặc dù 'Hàm myFunc = Person :: new;' sẽ là neater. Cũng lưu ý rằng điều này không thực sự mở rộng cho nhiều thông số ctor ... –
Nhà máy không rõ ràng. Nhà máy đơn giản và phương pháp nhà máy rất khác nhau. Mẫu nào? – Fuhrmanator