6

Builder デザイン パターンを C で実装する方法はありますか? Builder が構造体に値を設定する方法があるかどうか疑問に思っていますが、構造体が Builder によって生成された後、構造体を読み取り専用にします。

オンラインで例を探しましたが、C では見つかりませんでした。ありがとうございます。

4

2 に答える 2

10

ウィキペディアのページから:

...ビルダーパターンの意図は、伸縮コンストラクターのアンチパターンに対する解決策を見つけることです。伸縮コンストラクターのアンチパターンは、オブジェクト コンストラクター パラメーターの組み合わせの増加がコンストラクターの指数関数的リストにつながる場合に発生します。多数のコンストラクターを使用する代わりに、ビルダー パターンは別のオブジェクト、ビルダーを使用します。このオブジェクトは、各初期化パラメーターを段階的に受け取り、結果として構築されたオブジェクトを一度に返します。

したがって、これを実現する 1 つの方法は、構築するオブジェクトを記述できるインターフェイスを使用してビルダー オブジェクトを定義することです。次に、その記述に基づいてターゲット オブジェクトを構築できる別のメソッドを提供します。

ウィキペディアのページにある車の例を使用すると、次のようになります。

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と、返されたオブジェクトを直接変更できないことを呼び出し元に通知します。

于 2013-07-12T00:06:44.403 に答える