2010-01-29 30 views
10

Trong ứng dụng của tôi, có thể tạo một số báo cáo khác nhau (CSV, HTML, v.v.).Phương thức kiểu nhà máy Enum

Thay vì tạo mẫu phương thức kiểu nhà máy truyền thống, tôi đã lên kế hoạch thêm phương thức vào thân của hằng số enum để tạo và trả về đối tượng báo cáo thích hợp.

public enum ReportType { 
CSV { 
    @Override 
    public Report create() { 
    return new CSVReport(); 
    } 
}, 
HTML { 
    @Override 
    public Report create() { 
    return new HTMLReport(); 
    } 
}; 

public abstract Report create(); 
} 

Với REPORTTYPE enum liên tục quy định, tôi có thể sau đó dễ dàng tạo ra một báo cáo mới bằng cách thực hiện một tuyên bố như sau:

ReportType.CSV.create() 

tôi muốn để có được những ý kiến ​​của người khác về việc sử dụng phương pháp này. Bạn nghĩ gì về điều này? Bạn có thích cách tiếp cận nào khác không, và nếu có thì tại sao?

Cảm ơn

Trả lời

4

Tôi nghĩ cả hai cách tiếp cận đều ổn, nhưng nếu bạn không muốn biết bạn đang tạo loại báo cáo nào thì tôi tin rằng cách tiếp cận enum là tốt nhất. Cũng giống như vậy:

Giả sử bạn kiên trì một trường hợp người trên một cơ sở dữ liệu và lấy nó sau này - nếu bạn sử dụng polimorphism bạn sẽ không cần bất kỳ chuyển đổi wathsoever. Điều duy nhất bạn cần làm là để gọi phương thức create(). Giống như:

Person person = null; 
//... retrieve the person instance from database and generate a 
//report with his/her prefered report type... 
Report report = person.getReportType.create(); 

Vì vậy, nếu bạn dựa vào đa hình, bạn không cần phải yêu cầu nhà máy cung cấp CVS/HTML/PDF một cách rõ ràng, hãy để công việc đó cho chính Enum. Nhưng tất nhiên, có những tình huống mà bạn có thể cần phải sử dụng một hoặc khác, mặc dù tôi có xu hướng sử dụng phương pháp tiếp cận enum thường xuyên.

1

Joshua Bloch (chuyên gia Java công nhận) thực sự khuyến cáo phương pháp này trong cuốn sách của ông Effective Java 2nd Edition trên trang 17: Thực thi các tài sản singleton với một xây dựng tư nhân hoặc một loại enum.

+0

Đó là về Singletons. – Steve

3

Lợi thế bạn đạt được bằng cách sử dụng enum cho ví dụ về tạo Báo cáo là gì? Nếu bạn có phương pháp nhà máy, bạn sẽ tạo một phiên bản CSVReport (nói) như sau:

Report csvReport = ReportFactory.createCSVReport(); 

mà tôi nghĩ truyền đạt ý định tốt hơn enum. Như tôi hiểu Enumerations đại diện cho một tập hợp cố định của hằng số, và sử dụng nó như là một nhà máy để tạo ví dụ (mặc dù hoạt động) dường như tôi sử dụng sai mục đích của Enumeration.

+0

Điểm hợp lệ. Enum trong Java thường được sử dụng theo cách bên ngoài chỉ chứa các hằng số vì chúng là các lớp. Tôi đoán tôi thích sự đơn giản mà đưa ra một loại báo cáo, sau đó tôi có thể chọn để tạo ra nó mà không có bất kỳ nhà máy. Điều này sẽ không nhất thiết yêu cầu mã bổ sung cho nhà máy. – Steve

+3

Điểm của việc sử dụng enums, và thực sự của các nhà máy trừu tượng, là điểm mà tại đó bạn quyết định chi tiết thực hiện được lấy ra từ điểm yêu cầu tạo ra. (Vì vậy, nếu bạn sẽ không bao giờ tách rời những điểm đó, thì không có điểm nào trong sự thiếu đạo đức sớm.) –

2

Nhìn vào số Enum with Visitor Pattern. Với cách tiếp cận đó, bạn sẽ có thể tự động thêm chức năng vào một enum mà không cần phải gây ô nhiễm bản thân enum.

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