使用ANSI C的工厂模式实现

时间:2010-07-08 14:16:18

标签: c design-patterns factory c89

有人能指出我如何使用ANSI C实现工厂模式吗?如果覆盖更多的模式,那将只是一个奖励。在C ++中这样做对我来说是微不足道的,但由于C没有类和多态,我不太清楚如何做到这一点。我正在考虑使用所有常见数据类型的“基础”结构,然后使用void指针,并按照与顶部基础结构相同的顺序定义结构的所有公共部分?或者是否无法保证它们在内存中以相同的方式结束?

4 个答案:

答案 0 :(得分:6)

工厂模式也可以在C中实现,假设以下是您的接口定义的操作:

typedef int (*operations_1) (void *data);
typedef int (*operations_2) (void *data);

typedef struct impl_ops_t
{
    operations_1 op1;
    operations_2 op2;
} impl_ops_t;

因此,为了能够获得实现此类接口的实现实例, 您应该定义包含数据和操作的结构,然后您可以定义创建 操作将返回给你那个结构,也可能是一个销毁操作:

typedef struct ctx_t
{
    void       *data;
    impl_ops_t *operations;
} ctx_t;

typedef ctx_t   (*create_handle)   (void);
typedef void    (*destroy_handle)  (ctx_t **ptr);

typedef struct factory_ops
{
    create_handle  create;
    destroy_handle destroy;
} factory_ops;

您还应该定义一个为您提供工厂方法的函数, 也许你应该有办法在正确的基础上实施 您的需求(可能不是像下面示例中的简单参数):

typedef enum IMPL_TYPE
{
    IMPL_TYPE_1,
    IMPL_TYPE_2
} IMPL_TYPE;
factory_ops* get_factory(int impl_type);

所以它将被用作:

main (...)
{
    factory_ops fact = get_factory(IMPL_TYPE_2);

    // First thing will be calling the factory method of the selected implementation
    // to get the context structure that carry both data ptr and functions pointer
    ctx_t *c = fact->create();

    // So now you can call the op1 function
    int a = c->operations->op1(c->data);
    // Doing something with returned value if you like..
    int b = c->operations->op2(c->data);
    // Doing something with returned value if you like..

    fact->destroy(&c);
    return 0;
}

答案 1 :(得分:1)

C有函数指针和结构。所以你可以用C实现类。

这样的事情会给你一个线索。

void class1_foo() {}
void class2_foo() {}

struct polyclass
{
    void (*foo)();
};

polyclass make_class1() { polyclass result; result.foo = class1_foo; return result; }

答案 2 :(得分:1)

Here位于页面底部,是一系列关于C

中模式的文章

答案 3 :(得分:0)

工厂模式是面向对象的设计模式。

C不是面向对象的语言。

因此,我会质疑你在C中的工厂目标是什么。