2011-01-06 46 views
17

Tôi đang xem qua Hiệu quả Java và một số thứ của tôi mà tôi coi là tiêu chuẩn không được đề xuất bởi cuốn sách, ví dụ như tạo đối tượng, tôi đã ấn tượng rằng nhà thầu là cách tốt nhất để làm điều đó và sách nói rằng chúng ta nên sử dụng các phương pháp nhà máy tĩnh, tôi không thể vài lợi thế và bất lợi như vậy và do đó đang hỏi câu hỏi này, đây là những lợi ích của việc sử dụng nó.Tạo đối tượng: Constructors hoặc phương thức nhà máy tĩnh

Ưu điểm:

  1. Một ưu điểm của phương pháp nhà máy tĩnh là, không giống như nhà thầu, họ có tên.
  2. Lợi thế thứ hai của phương pháp nhà máy tĩnh là, không giống như các nhà thầu, chúng không bắt buộc phải tạo đối tượng mới mỗi lần được gọi.
  3. Lợi thế thứ ba của phương pháp nhà máy tĩnh là, không giống như các nhà thầu, chúng có thể trả về một đối tượng của bất kỳ loại phụ nào của kiểu trả về của chúng.
  4. Lợi thế thứ tư của phương pháp nhà máy tĩnh là chúng giảm độ dài của việc tạo các thể hiện kiểu tham số.

Nhược điểm:

  1. Nhược điểm chính của chỉ cung cấp phương pháp nhà máy tĩnh là lớp mà không nhà xây dựng công cộng hoặc bảo vệ không thể được subclassed.
  2. Một bất lợi thứ hai của phương pháp nhà máy tĩnh là chúng không phải là dễ dàng phân biệt với các phương pháp tĩnh khác.

tham khảo: Java hiệu quả, Joshua Bloch, phiên bản 2, pg: 5-10

Tôi không thể hiểu được lợi thế thứ tư và những bất lợi thứ hai và sẽ đánh giá cao nếu ai đó có thể giải thích những điểm đó. Tôi cũng muốn hiểu làm thế nào để quyết định sử dụng có nên đi cho Constructor hoặc phương pháp nhà máy tĩnh để tạo đối tượng.

+0

IMHO, nó đi xuống đến phức tạp: bạn cần phải tạo ra phức tạp hơn nếu mã của bạn sẽ không được mở rộng bởi bất cứ ai nhưng bạn? –

+0

Thậm chí nếu không có ai khác đang mở rộng mã, nó vẫn cần phải dễ dàng hiểu nếu bạn quay trở lại nó trong một vài tháng sau khi sửa lỗi bảo trì/sửa lỗi, v.v. – Kurru

+0

Vì vậy, sẽ đủ công bằng để nói rằng hàm tạo sẽ không tạo phức tạp và phương pháp nhà máy tĩnh sẽ? Tôi đang cố hiểu cách nào sẽ mang lại sự phức tạp hơn? – Rachel

Trả lời

17
  • Advantage 4: Khi sử dụng một constructor, bạn có

    Foo<Map<Key, Value>> foo = new Foo<Map<Key, Value>>(); 
    

    vs

    Foo<Map<Key, Value>> foo = Foo.createFoo(); // no need to repeat 
    

    lợi thế này sẽ biến mất trong Java 7, khi cú pháp kim cương sẽ được giới thiệu

  • Nhược điểm 2. Bạn không thể dễ dàng biết được phương thức static đã cho s được sử dụng cho constructor, hoặc cho cái gì khác.

Cách chọn - không có công thức duy nhất cho điều đó. Bạn có thể cân nhắc tất cả các ưu điểm và nhược điểm trên cho một trường hợp sử dụng, nhưng thông thường nó sẽ chỉ là một quyết định được thúc đẩy bởi kinh nghiệm.

+0

Bozho: Đối với bất lợi 2, bạn có thể đề xuất một trường hợp sử dụng mà không biết liệu một phương pháp tĩnh nhất định được sử dụng cho nhà xây dựng hay không sẽ gây ra vấn đề lớn? Tôi chỉ đang cố gắng hiểu những tác động gây hại và lý do tại sao nó được đề cập là bất lợi? – Rachel

+3

@Rachel: Phương thức tĩnh 'getFoo()' trong lớp 'Foo' sẽ làm gì? Tạo và trả về một 'Foo' mới? Hoặc trả về một thể hiện con của 'Foo'? Hoặc thậm chí một trường hợp singleton? Tuy nhiên, nhược điểm 2 có thể được giám sát bằng cách chọn các tên phương thức theo cách thông minh như 'createFoo()', 'getChildFoo()' và 'getInstance()'. Đó là tất cả về cách viết mã tự tài liệu. – BalusC

+0

@BalusC: Cảm ơn bạn đã giải thích, tôi đã cố gắng để so sánh phương pháp nhà máy tĩnh vs Constructor và xem lý do tại sao là phương pháp nhà máy tĩnh đề nghị của cuốn sách. – Rachel

4

Nếu bạn biết loại bê tông của lớp bạn đang cố gắng tạo, sau đó gọi hàm dựng là tốt.

Phương pháp nhà máy tĩnh là tốt đẹp khi bạn không hoàn toàn chắc chắn cách xây dựng đối tượng bạn cần.

Phương thức Factory vẫn gọi hàm Constructor trên kiểu bê tông, nhưng phương thức xử lý quyết định loại lớp bê tông nào sẽ khởi tạo. Phương thức Factory sau đó trả về một kiểu Interface (chứ không phải là một kiểu cụ thể) để loại bê tông bị ẩn khỏi người gọi.

+1

Một khía cạnh hữu ích của phương pháp nhà máy là trong nhiều trường hợp, các phiên bản tương lai của phương pháp nhà máy sẽ trả về các loại bổ sung mà không cần phải thay đổi mã cơ bản. Ví dụ, một phương thức 'ImmutableMatrixOfDouble.Create' có thể thấy nếu đối số của nó là một ma trận vuông mà chỉ các phần tử khác không nằm trên đường chéo, và trả về một' ImmutableDiagonalMatrix'() trong trường hợp này. Một 'ImmutableDiagonalMatrix' 256x256 sẽ chỉ yêu cầu khoảng 1/256 không gian nhiều như là một mảng 256x256, vì vậy nếu nhiều mảng bất biến sẽ xảy ra để phù hợp với mô hình, người ta có thể tiết kiệm không gian. – supercat

0

Nhược điểm 2.

Một phương pháp tĩnh được sử dụng để tạo đối tượng có cách bố trí chức năng tương tự và sự xuất hiện như bất kỳ chức năng tĩnh khác.

Chỉ bằng cách xem xét phương pháp tĩnh tạo đối tượng bạn sẽ không biết nó thực hiện điều này và ngược lại là phần liên quan. Khi bạn viết mã mà bạn không quen thuộc, có thể khó xác định phương thức tĩnh chính xác được sử dụng để tạo các đối tượng.

Việc sử dụng Static Factory Pattern cũng được ghi lại và có thể rất hữu ích, đặc biệt là trong các tình huống SingletonMultiton. Cũng hữu ích trong việc khởi tạo các đối tượng phức tạp.

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