2015-10-02 10 views
5

Gần đây tôi bắt gặp một mô hình xây dựng hấp dẫn tôi.Logic bên trong BuilderPattern

Vì vậy, tôi có một số EntityBuilder tạo mã số Entity nhưng không trả lại đối tượng. Dưới đây là phương pháp chữ ký:

public void build(); 

Thay vào đó, bên trong phương pháp build(), nó cung cấp các đối tượng mới được tạo ra, các Entity, để một trường hợp CacheImplementation để lưu trữ nó. Lưu ý: CacheImpl được tiêm vào hàm tạo của trình tạo.

public void build(){ 
    //create new entity 
    cacheImplementation.add(entity); 
} 

Điều này có vẻ là phương pháp hay nhất không?

Sau đó chỉnh sửa 0

public interface EntityBuilder { 

    void setProperty0(PropertyObject propertyObject0); 
    void setProperty1(PropertyObject propertyObject1); 
    void setProperty2(PropertyObject propertyObject2); 
    //... 

    void build(); 
} 

public class EntityBuilderImpl implements EntityBuilder { 

    PropertyObject propertyObject0; 
    PropertyObject propertyObject1; 
    PropertyObject propertyObject2; 
    //... 

    // setters for all properties 
    @Override 
    public void build(){ 
     //create new entity 
     cacheImplementation.add(entity); 
    } 
} 

Các builder được sử dụng theo cách sau:

public class EntityProcessor{ 
    private EntityBuilderFactory entityBuilderFactory;//initialized in constructor 

    void process(EntityDetails entityDetails){ 
     EntityBuilder entityBuilder = this.entityBuilderFactory.getNewEntitytBuilder(); 
     //.. 
     // entityBuilder.set all properties from entityDetails 
     entityBuilder.build(); 
    } 
} 

Lưu ý: trường hợp cacheImpl chỉ lưu trữ các đối tượng trong một List<> đó là truy cập mỗi N giây.

Trả lời

2

Điều này có vẻ giống như phương pháp hay nhất không?

Mẫu trình xây dựng truyền thống không lưu trữ đối tượng được tạo ở bất kỳ đâu, nó chỉ trả về nó.

Tôi có thể tưởng tượng một biến thể trong đó trình tạo cũng có vai trò điều khiển mẫu để tránh tạo đối tượng trùng lặp và quản lý cửa hàng đối tượng không thay đổi.

Quyết định không trả về một thể hiện có thể là làm rõ rằng phương pháp này có tác dụng phụ. Nếu phương pháp trả về đối tượng, nó có thể gây hiểu lầm khi nghĩ rằng đó là một người xây dựng truyền thống không có tác dụng phụ, khi đó không phải là trường hợp ở đây.

Trong mọi trường hợp, tất cả điều này chỉ là suy đoán, vì chúng tôi chưa thấy phần còn lại của mã nơi sử dụng và cách mã được triển khai và sử dụng. Chúng tôi không có đủ ngữ cảnh để thực sự đánh giá. Không có gì sai khi phát minh ra các mẫu mới, nhưng nó có thể được thực hiện tốt hoặc xấu.

+0

Các biến thể của mẫu thiết kế truyền thống có vẻ đẹp. Tôi đã thêm một đoạn mã nhỏ để xem ý tôi là gì. Có đủ để phán xét không? – VladLucian

+0

Không, không đủ. Phần thú vị hơn sẽ là sử dụng trình tạo và bộ nhớ cache. Btw một danh sách như một bộ nhớ cache âm thanh lẻ. Tôi mong đợi một bản đồ. – janos

+0

Đây không phải là Danh sách, đó là Tập được xóa lúc N giây, mỗi khi quá trình xử lý bắt đầu. Tôi đã chỉnh sửa lại cách trình xây dựng được sử dụng. – VladLucian

0

Tôi đã xem phương pháp tương tự void build() trong lớp JCodeModel. Như bạn có thể nhìn thấy nó ném IOExceptionresources it manages:

public void build(File destDir, 
        PrintStream status) 
      throws IOException 

Bạn về cơ bản yêu cầu nó để thực hiện các hoạt động cho bạn và nếu không có lỗi hiện diện - bạn có thể tiếp tục với công việc.

+0

@Vlad sẽ rất tuyệt nếu bạn xóa nhận xét "cảm ơn". Chính sách trang web cho các câu trả lời hữu ích đang bỏ phiếu cho những câu trả lời đó. Hãy giữ nó sạch sẽ. Tôi cũng sẽ xóa nhận xét này sau. – ekostadinov

0

Trình xây dựng chung được sử dụng theo cách sau: Một số lớp sẽ sử dụng trình tạo để tạo lớp. Đơn giản

enter image description here


Bây giờ bạn có thêm mảnh phức tạp - bộ nhớ đệm. Bạn có thể đặt bộ nhớ đệm bên trong Builder hoặc một cấp cao hơn bên trong Bộ xử lý.

ý nghĩa của việc đưa quản lý bộ nhớ cache bên trong xây dựng là gì:

  • Builder không có trách nhiệm duy nhất nữa.
  • Nó không làm việc như thế nào bạn mong chờ ở cái nhìn đầu tiên
  • Bạn không thể tạo đối tượng mà không đưa nó vào bộ nhớ cache

Những vấn đề này sẽ không xảy ra nếu bạn đặt quản lý bộ nhớ cache để lớp riêng biệt.


Tôi cho rằng đó không phải là giải pháp khủng khiếp, nhưng chắc chắn sẽ làm giảm khả năng bảo trì mã của bạn.