C中的生成器模式

问题描述 投票:6回答:2

有没有办法在C中实现Builder设计模式?我想知道是否有一种方法可以让Builder在结构中设置值,但是在构造生成结构之后,结构是只读的。

我在网上搜索了一些例子,但在C中找不到任何例子。谢谢。

c design-patterns
2个回答
8
投票

来自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的指针,向调用者发出无法直接修改返回对象的信号。


0
投票

有没有办法在C中实现构建器设计模式?

当我搜索一种显而易见且安全的初始化struct成员的方法时,出现了这个问题。

我问了一位有经验的C(也是Python仿上)同事关于它,期待没有任何用处,或者可能是一个“聪明的伎俩”,但是 - 哇! - 我被告知是一个内置的C99功能[1],看看:[2]

#include <stdio.h>

struct X { int a, b, c; };

int main(void) {
    struct X x = {.a=1, .b=2};
    printf("x: %d %d %d\n", x.a, x.b, x.c);
    x = (struct X){.a=1, .c=3};
    printf("x: %d %d %d\n", x.a, x.b, x.c);
    // initialize a const
    // order can be changed when elements are named
    const struct X cx = {.c=3, .b=2, .a=1};
    printf("cx: %d %d %d\n", cx.a, cx.b, cx.c);
    return 0;
}

附:好吧,const可能是相对的:https://ideone.com/dZMFzK

© www.soinside.com 2019 - 2024. All rights reserved.