2012-02-22 30 views
8

Tôi sử dụng mẫu Builder cho một số lớp của dự án của tôi (nhiều đối số, một số bắt buộc, một số tùy chọn, v.v.). Các lớp này là không thay đổi (không có setters, bản sao sâu cho các bộ sưu tập getters).Pattern Builder và Persistence

Tôi hiện đang cố gắng lưu trữ các đối tượng đó trong cơ sở dữ liệu bằng cách sử dụng khung kiên trì để tạo đối tượng với các hàm dựng + constructor mặc định. Nó không giống như các nhà xây dựng của tôi rất nhiều!

Tôi không muốn làm giảm thiết lập đó thành POJO và mất lợi thế của thiết kế hiện tại (tính linh hoạt, bất biến, bảo mật xây dựng).

Tôi sẽ hoan nghênh bất kỳ phản hồi nào về cách giải quyết có thể được sử dụng trong trường hợp này (tôi có thể bao gồm từng lớp này nhưng sẽ tăng gấp đôi số lớp và tôi muốn tránh điều đó).

Một post thực sự là điểm bất lợi cụ thể của mẫu Trình tạo.

EDIT

Một answer đề nghị sử dụng xây dựng tư nhân/setters nhưng điều đó chỉ hoạt động nếu các lĩnh vực của lớp không phải là cuối cùng, đó không phải là trường hợp của tôi.

CUỐI CÙNG EDIT

Nhờ tất cả.
Những gì tôi nghĩ sẽ được giải pháp cuối cùng của tôi trông như thế này và hoạt động tốt (đối với hồ sơ, tôi đang sử dụng MongoDB + nha phiến):

class AClass { 
    private final String aField; 
    private final AClass() { 
     aField = ""; 
    } 
    //Standard builder pattern after that - no setters (private or public) 
} 
+4

Bạn không thể bao gồm người định cư và người xây dựng mặc định nhưng đặt chúng ở chế độ riêng tư? – DaveJohnston

+0

Câu hỏi hay - Tôi sẽ kiểm tra xem – assylias

+0

Tôi biết Hibernate có thể sử dụng trình cài đặt riêng tư và hàm tạo, chỉ cần tự hỏi nếu bạn có bất kỳ điều gì chống lại điều này cho trường hợp cụ thể của bạn. – DaveJohnston

Trả lời

6

Như tôi đã nói trong nhận xét của tôi: bạn có thể bao gồm một constructor mặc định và tất cả những người định cư bắt buộc nhưng đặt chúng ở chế độ riêng tư. Bằng cách này bạn duy trì tính bất biến của các đối tượng của bạn nhưng một ORM như Hibernate sẽ có thể truy cập vào các phương thức/constructor khi nó cần.

Bất kỳ ai khác cũng có thể truy cập các phương thức này bằng cách sử dụng sự phản chiếu, nhưng sau đó họ cũng có thể truy cập các biến thành viên riêng tư bằng cách sử dụng sự phản chiếu. Vì vậy, không có nhược điểm thực sự để thêm các phương pháp riêng tư.

+1

Điều đó hoạt động nếu các trường không phải là cuối cùng. Nhưng nếu họ là sau đó tôi không thể sử dụng constructor mặc định/setters tư nhân vì lý do rõ ràng. – assylias

+3

Nếu khuôn khổ persistence đang sử dụng sự phản chiếu để truy cập một hàm tạo riêng, thì nó sẽ có thể thiết lập trực tiếp các lớp các lớp. Điều này làm việc ngay cả khi các trường là cuối cùng. – TDJoe

+1

Thiết lập các trường để cuối cùng rõ ràng là một phần của việc làm cho một đối tượng bất biến, nhưng nếu không có phương pháp nào để thay đổi đối tượng, thì có cần cho các trường cuối cùng không? Khác với để đảm bảo bạn không tự sửa đổi các giá trị vô tình trong các phương thức bên trong lớp? – DaveJohnston