2013-07-11 74 views
5

有沒有一種方法可以在C中實現構建器設計模式?特別是,我想知道是否有一個通過Builder來設置結構中的值,但是在Builder生成結構之後,該結構是隻讀的。我在網上查找示例,但在C中找不到任何內容。謝謝。C中的構建器設計模式

+7

'const struct foo * build_struct();',然後讓函數mallocate爲結構體分配內存。在外部世界可見時,它將在函數內部爲非''constst',而爲'const'。 – 2013-07-11 22:49:37

+2

@ H2CO3:您應該將其作爲答案發布。 –

回答

7

wikipedia page

...建造者模式的目的是要找到解決的伸縮式構造的反模式。當對象構造函數參數組合的增加導致構造函數的指數列表時,會出現伸縮構造函數反模式。構建器模式不是使用大量構造函數,而是使用另一個對象(構建器),它逐步接收每個初始化參數,然後一次返回結果構造對象。

因此,實現這一目標的一種方法是定義一個具有接口的構建器對象,以便您可以描述要構建的對象。然後,您提供了另一種方法,允許您基於該描述構建目標對象。

使用在維基百科頁面轎廂例如:

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); 

返回一個指向const struct car信號,該返回的對象不能直接修改的調用者。