C语言中的Builder模式

C语言中的Builder模式,c,design-patterns,C,Design Patterns,有没有一种方法可以在C中实现Builder设计模式?我想知道是否有一种方法可以让构建器在结构中设置值,但在构建器生成结构后,结构将是只读的 我在网上查找示例,但在C中找不到任何示例。谢谢。来自: 。。。构建器模式的目的是找到伸缩构造函数反模式的解决方案。当对象构造函数参数组合的增加导致构造函数的指数列表时,就会出现伸缩构造函数反模式。构建器模式不使用大量构造函数,而是使用另一个对象,一个构建器,它一步一步地接收每个初始化参数,然后立即返回生成的构建对象 因此,实现这一点的一种方法是定义一个具有接

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

我在网上查找示例,但在C中找不到任何示例。谢谢。

来自:

。。。构建器模式的目的是找到伸缩构造函数反模式的解决方案。当对象构造函数参数组合的增加导致构造函数的指数列表时,就会出现伸缩构造函数反模式。构建器模式不使用大量构造函数,而是使用另一个对象,一个构建器,它一步一步地接收每个初始化参数,然后立即返回生成的构建对象

因此,实现这一点的一种方法是定义一个具有接口的生成器对象,该接口允许您描述要构建的对象。然后提供另一种方法,允许您基于该描述构造目标对象

使用维基百科页面中的汽车示例:

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

有没有一种方法可以在C中实现builder设计模式

当我搜索一种明显且安全的初始化结构成员的方法时,出现了这个问题

我向一位有C语言经验(但也是Python仿射)的同事询问了这件事,他要么没什么用处,要么可能是一个“聪明的把戏”,但是-哇我被告知是一个内置的C99功能[1],看看:[2]

#包括
结构X{inta,b,c;};
内部主(空){
结构X={.a=1,.b=2};
printf(“x:%d%d%d\n”,x.a,x.b,x.c);
x=(结构x){.a=1.c=3};
printf(“x:%d%d%d\n”,x.a,x.b,x.c);
//初始化常量
//命名元素时可以更改顺序
const struct X cx={.c=3.b=2.a=1};
printf(“cx:%d%d%d\n”,cx.a、cx.b、cx.c);
返回0;
}

  • [1]
  • [2] 请参阅上的“running”演示

注意,const可能是相对的:

const struct foo*build_struct(),然后让函数mallocate结构的内存。它在函数内部是非常量的,但在外部世界可见时是常量的。@H2CO3:你应该把它作为答案发布。当然,如果你不需要生成器模式,就不要使用它!你是对的,这只是我所寻找的构建器模式的一个方面:初始化时元素的命名(有时作为选项很有用)。我重新阅读了OP的问题,我似乎很清楚OP希望构建器创建一个只读对象。是的,初始化const结构的成员也很容易。例如,如果创建一个对象需要一系列协调良好的步骤,我会考虑Builder进行非平凡的初始化。事实上,一个成熟的构造器在实际中看起来是这样的,但提问者似乎只要求一个非常有限的变体。
#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;
}