2013-07-11 29 views
5

Có cách nào để triển khai mẫu thiết kế trình xây dựng trong C không? Đặc biệt, tôi tự hỏi nếu có một để đặt giá trị trong một cấu trúc thông qua một Builder, nhưng sau đó có cấu trúc được chỉ đọc sau khi cấu trúc được sản xuất bởi Builder. Tôi đã tìm kiếm các ví dụ trực tuyến nhưng không thể tìm thấy bất kỳ ví dụ nào trong C. Cảm ơn bạn.mẫu thiết kế trình xây dựng trong C

+7

'const struct foo * build_struct();', sau đó để bộ nhớ mallocate chức năng cho cấu trúc. Nó sẽ không phải là 'const' bên trong hàm nhưng 'const' khi hiển thị với thế giới bên ngoài. –

+2

@ H2CO3: Bạn nên đăng câu trả lời đó. –

Trả lời

7

Từ wikipedia page:

... mục đích của mô hình xây dựng là để tìm một giải pháp cho các nhà xây dựng lồng chống mẫu. Mô hình chống tạo mô hình lồng ghép xảy ra khi sự gia tăng của sự kết hợp tham số hàm tạo đối tượng dẫn đến một danh sách hàm mũ của các hàm tạo. Thay vì sử dụng nhiều hàm tạo, mô hình trình xây dựng sử dụng một đối tượng khác, một trình tạo, nhận từng tham số khởi tạo theo từng bước và sau đó trả về đối tượng đã tạo kết quả cùng một lúc.

Vì vậy, một cách để đạt được điều này là xác định đối tượng trình xây dựng với giao diện cho phép bạn mô tả đối tượng bạn muốn tạo. Sau đó, bạn cung cấp một phương thức khác cho phép bạn xây dựng đối tượng đích dựa trên mô tả đó.

Sử dụng ví dụ xe trong trang wikipedia:

struct car; 
struct car_builder; 

enum CAR_OPTIONS { CAR_OPTION_NOT_AN_OPTION, 
        CAR_OPTION_SEATS, CAR_OPTION_NAVIGATION, /* ... */ }; 

struct car_builder * create_car_builder(); 

/* 
* Positive option sets the option, negative option unsets it. 
* If the option takes a parameter, pass them in the varargs. 
*/ 
void car_builder_option (struct car_builder *, int option, ...); 

/* 
* builds a car 
*/ 
const struct car * car_builder_construct (struct car_builder *options); 

/* 
* junks the car 
*/ 
void car_builder_destruct (const struct car *); 

/* ... */ 
struct car_builder *options = create_car_builder(); 
car_builder_option(options, CAR_OPTION_SEATS, 2); 
car_builder_option(options, CAR_OPTION_SPORT_CAR); 
car_builder_option(options, CAR_OPTION_NAVIGATION); 
car_builder_option(options, -CAR_OPTION_POWER_WINDOWS); 
const struct car *car = car_builder_construct(options); 

Trả về một con trỏ đến một const struct car tín hiệu cho người gọi rằng đối tượng quay trở lại không thể chỉnh sửa trực tiếp.

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