2017-01-28 37 views
5

Có đúng để sử dụng java.util.function.Function để thực hiện thiết kế Factory Patternsử dụng java.util.function.Function để thực hiện thiết kế Factory Pattern

Trong ví dụ sau, tôi đã sử dụng tài liệu tham khảo chức năng để khởi tạo một đối tượng Kiểu người.

import java.util.function.Function; 

public class Main { 
    public static void main(String[] args) { 
     Function<String , Person> myFunc = (String s) -> new Person(s); 
     Person p = myFunc.apply("Shan"); 
     System.out.println(p.getName()); 
    } 
} 

class Person{ 
    private String name; 

    public Person(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 


} 
+1

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 ... –

+1

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

Trả lời

3

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"); 
    } 
} 
+2

Lưu ý đây là mẫu ** Nhà máy ** Tóm tắt. Bạn truyền vào một 'Function ' và người nhận sử dụng nó để tạo một 'Person' - người gọi không biết nếu' Function' trả về 'SmartPerson' hoặc' DumpPerson' (để sử dụng ví dụ của bạn). Người gọi không biết nếu cùng một ví dụ 'Person' được trả về mỗi lần. Đây là _exactly_ những gì một mô hình nhà máy là nghĩa vụ phải làm; trừu tượng hóa logic tạo ra từ trang cuộc gọi. –

+0

@BoristheSpider không phải mỗi se, mô hình nhà máy trừu tượng đóng gói nhiều nhà máy –

+2

'(String s) -> mới DumbPerson (s)' và '(String s) -> mới SmartPerson (s)' sẽ cung cấp cho bạn hai "nhà máy" khác nhau . – Calculator

Các vấn đề liên quan