2013-10-02 19 views
5

Ưu điểm của việc sử dụng mẫu xây dựng bên trong so với bên ngoài lớp học là gì?Mô hình Builder bên trong và bên ngoài lớp học?

lớp Bên trong:

public class Person { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

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

    public Person setEyeColor(String eyeColor) { 
     this.eyeColor = eyeColor; 
     return this; 
    } 

    public Person setHairColor(String hairColor) { 
     this.hairColor = hairColor; 
     return this; 
    } 
} 

// Example usage: 
Person p = new Person() 
       .setName("Bob") 
       .setHairColor("Black") 
       .setEyeColor("Brown") 

Bên ngoài lớp:

public class Person { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

    public Person(String name, String eyeColor, String hairColor) { 
     this.name = name; 
     this.eyeColor = eyeColor; 
     this.hairColor = hairColor; 
    } 
} 

public class PersonBuilder { 
    private String name; 
    private String eyeColor; 
    private String hairColor; 

    public Person build() { 
     return new Person(name, eyeColor, hairColor); 
    } 

    public PersonBuilder with(String name) { 
     this.name = name; 
     return this; 
    } 

    public PersonBuilder setEyeColor(String eyeColor) { 
     this.eyeColor = eyeColor; 
     return this; 
    } 

    public PersonBuilder setHairColor(String hairColor) { 
     this.hairColor = hairColor; 
     return this; 
    } 
} 

// Example usage: 
Person p = new PersonBuilder() 
       .setName("Bob") 
       .setHairColor("Black") 
       .setEyeColor("Brown") 
       .build(); 
+0

Đây là ý kiến ​​dựa trên ... Nhưng tôi nghĩ rằng có nó bên trong làm giảm sự lộn xộn. Bạn có thể có MyClass.Builder, MyClass2.Builder, v.v. - và không có một bó toàn bộ MyClassBuilder, MyClass2Builder, vv các lớp học – ppeterka

+0

Đối với những điều đơn giản nó không thực sự quan trọng, tuy nhiên bạn có thể muốn sử dụng các kiểu trả về setter cho một số khác chỉ định (trong những người định cư phức tạp), trong trường hợp đó người ngoài sẽ cung cấp sự linh hoạt hơn. Cá nhân tôi sẽ đi với một bên ngoài. – Thihara

+0

IMHO, Trình xây dựng phải là một lớp bên trong vì nó có nghĩa là được sử dụng độc quyền bởi lớp đang được xây dựng. Bởi vì điều đó, không có lợi ích thực sự trong việc biến nó thành một lớp học bình thường. – hfontanez

Trả lời

7

Nó phụ thuộc.

Tôi thường kết hợp các mẫu BuilderFactory để có ý nghĩa khi có Trình tạo dưới dạng lớp ngoài vì đối tượng "được xây dựng" có thể là một trong nhiều triển khai. Điều này có một lợi ích bổ sung cho phép việc triển khai thực hiện các gói riêng bên trong hoặc thậm chí là các lớp bên trong riêng tư của Builder.

Nếu bạn đang sử dụng Trình tạo để chỉ làm cho hàm tạo của lớp công khai có ý định tiết lộ hoặc ít lộn xộn hơn là sở thích cá nhân thực sự. Người ta có thể cân nhắc ưu và nhược điểm của việc có một lớp bổ sung trong API, điều này có thể khiến người dùng khó hiểu.

Tuy nhiên, tôi khuyên bạn nên chọn một trong các tùy chọn và gắn bó với nó trong suốt API. Nó làm cho kiến ​​trúc hệ thống tổng thể dễ hiểu hơn nếu tất cả các nhà xây dựng là các lớp bên trong hoặc các lớp bên ngoài; đừng trộn chúng.

Không trộn lẫn Builders bên trong và bên ngoài như thế này:

Foo foo = new Foo.Builder(...) 

Bar bar = new BarBuilder(...) 
1

Việc thực hiện 2 đảm bảo với bạn rằng bạn sẽ nhận được một đối tượng đã hoàn thành và do đó làm cho nó thực hiện đáng tin cậy hơn trong khi người đầu tiên là unstated u cho đến khi kết thúc thiết lập tất cả các trường.

nói chung bạn không muốn đối tượng không có mặt để có sẵn để sử dụng.

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