2013-07-11 15 views
5

C言語でビルダー設計パターンを実装する方法はありますか?特に、ビルダーを介して構造体に値を設定することはできますが、ビルダーによって構造体が生成された後は構造体を読み取り専用にすることができますか?私はオンラインで例題を探しましたが、Cで何も見つかりませんでした。ありがとう。 wikipedia pageからCのビルダー設計パターン

+7

'const struct foo * build_struct();'次に、関数が構造体のメモリをmallocateするようにします。関数内では 'コンス'ではなく、外部から見えるときに 'const'になります。 –

+2

@ H2CO3:答えとして投稿する必要があります。 –

答えて

7

... Builderパターンの意図は、入れ子式のコンストラクタアンチパターンへの解決策を見つけることです。テレスコープ・コンストラクタのアンチ・パターンは、オブジェクト・コンストラクタのパラメータの組み合わせの増加が、指数関数的なコンストラクタ・リストにつながる場合に発生します。ビルダー・パターンは、多数のコンストラクターを使用する代わりに、それぞれの初期化パラメーターを段階的に受け取り、その結果生成されたオブジェクトを一度に戻すBuilderオブジェクトを使用します。

これを実現する1つの方法は、ビルドするオブジェクトを記述できるインタフェースを持つビルダーオブジェクトを定義することです。次に、その説明に基づいてターゲットオブジェクトを構築するための別の方法を提供します。返されたオブジェクトを直接変更することはできない発信者へconst struct car信号へのポインタを返す

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

:ウィキペディアのページで車の例を使用

関連する問題