Може ли някой да ме насочи към справка за това как да внедря фабричния модел с помощта на ANSI C? Ако са покрити повече модели, това би било просто бонус. Правенето на това в C++ е тривиално за мен, но тъй като C няма класове и полиморфизъм, не съм съвсем сигурен как да го направя. Мислех си да имам "базова" структура с всички общи типове данни и след това да използвам празни указатели и да дефинирам всички общи части на структурите в същия ред, както в основната структура в горната част? Или не е гарантирано, че ще се озоват по същия начин в паметта?
Реализация на фабричен модел с помощта на ANSI C
Отговори (4)
C има функционални указатели и структури. Така че можете да реализирате класове в C.
нещо подобно трябва да ви даде представа.
void class1_foo() {}
void class2_foo() {}
struct polyclass
{
void (*foo)();
};
polyclass make_class1() { polyclass result; result.foo = class1_foo; return result; }
Фабричният модел може да бъде имплементиран и в 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;
}
operations_1
и operations_2
? Има ли полза от използването на указател към указател за функция?
- person Andy Lin; 10.01.2021
Тук, в долната част на страницата, има поредица от статии за модели в C
Фабричният шаблон е обектно-ориентиран шаблон за проектиране.
C не е обектно-ориентиран език.
Затова бих се запитал каква е вашата цел за фабрика в C.