Skip to content

Commit b7e09fe

Browse files
author
Jarry
committed
add c for builder
1 parent 1d40661 commit b7e09fe

File tree

16 files changed

+433
-5
lines changed

16 files changed

+433
-5
lines changed

.vscode/settings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"files.associations": {
3+
"stdlib.h": "c"
4+
}
5+
}

builder-pattern/c/a.out

50.2 KB
Binary file not shown.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include "func.h"
4+
5+
void print_phone(Phone *phone)
6+
{
7+
printf("{ name: \"%s\"", phone->name);
8+
int screen_len = (int)sizeof(phone->screen) / sizeof(phone->screen[0]);
9+
printf(", screen: [");
10+
for (int i = 0; i < screen_len; i++)
11+
{
12+
printf("%d", phone->screen[i]);
13+
if (i != screen_len - 1)
14+
{
15+
printf(", ");
16+
}
17+
}
18+
printf("]");
19+
printf(", gpu_type: %d } \r\n", phone->gpu_type);
20+
}
21+
22+
void print_manual(Manual *manual)
23+
{
24+
printf("{ name: \"%s\"", manual->name);
25+
int screen_len = (int)sizeof(manual->screen) / sizeof(manual->screen[0]);
26+
printf(", screen: [");
27+
for (int i = 0; i < screen_len; i++)
28+
{
29+
printf("%d", manual->screen[i]);
30+
if (i != screen_len - 1)
31+
{
32+
printf(", ");
33+
}
34+
}
35+
printf("]");
36+
printf(", gpu_type: %d } \r\n", manual->gpu_type);
37+
}
38+
39+
void make_iphone()
40+
{
41+
// 创建手机建造者
42+
PhoneBuilder *phone_builder = create_phone_builder();
43+
// 根据建造者来创建对象
44+
build_iphone(phone_builder);
45+
Phone *phone = get_phone_product(phone_builder);
46+
// 根据建造者获取对象
47+
printf("iphone: %s | ", phone->name);
48+
print_phone(phone);
49+
50+
// 创建手册建造者
51+
ManualBuilder *manual_builder = create_manual_builder();
52+
// 根据建造者来创建对象
53+
build_iphone_manual(manual_builder);
54+
// 根据建造者获取对象
55+
Manual *manual = get_manual_product(manual_builder);
56+
printf("iphone manual: %s | ", manual->name);
57+
print_manual(manual);
58+
}
59+
60+
void make_huawei_phone()
61+
{
62+
// 创建手机建造者
63+
PhoneBuilder *phone_builder = create_phone_builder();
64+
// 根据建造者来创建对象
65+
build_huawei_phone(phone_builder);
66+
Phone *phone = get_phone_product(phone_builder);
67+
// 根据建造者获取对象
68+
printf("huawei phone: %s", phone->name);
69+
print_phone(phone);
70+
71+
// 创建手册建造者
72+
ManualBuilder *manual_builder = create_manual_builder();
73+
// 根据建造者来创建对象
74+
build_huawei_manual(manual_builder);
75+
// 根据建造者获取对象
76+
Manual *manual = get_manual_product(manual_builder);
77+
printf("huawei manual: %s", manual->name);
78+
print_manual(manual);
79+
}

builder-pattern/c/src/builder.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// 定义建造者的基础数据结构,可以不需要
2+
// 仅用作Phone和Manual结构体数据参考
3+
// typedef struct
4+
// {
5+
// char name[50];
6+
// int screen[2];
7+
// int gpu_type;
8+
// } Builder;

builder-pattern/c/src/director.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <stdio.h>
2+
#include "func.h"
3+
4+
/*
5+
* 指挥者,负责指挥建造者建造产品,隔离需求
6+
* c语言里没有类也不支持函数重载,这里仅用作函数集合
7+
*/
8+
9+
// 建造phone的iphone
10+
void build_iphone(PhoneBuilder *builder)
11+
{
12+
reset_phone(builder);
13+
int screen[2] = {120, 500};
14+
set_phone_name(builder, "iPhone");
15+
set_phone_screen(builder, screen);
16+
set_phone_gpu_type(builder, 100);
17+
}
18+
19+
// 建造phone的huwei phone
20+
void build_huawei_phone(PhoneBuilder *builder)
21+
{
22+
reset_phone(builder);
23+
int screen[2] = {140, 600};
24+
set_phone_name(builder, "HuaweiPhone");
25+
set_phone_screen(builder, screen);
26+
set_phone_gpu_type(builder, 102);
27+
}
28+
29+
// 建造phone的mi phone
30+
void build_mi_phone(PhoneBuilder *builder)
31+
{
32+
reset_phone(builder);
33+
int screen[2] = {130, 550};
34+
set_phone_name(builder, "MiPhone");
35+
set_phone_screen(builder, screen);
36+
set_phone_gpu_type(builder, 103);
37+
}
38+
39+
// 建造iphone手册
40+
void build_iphone_manual(ManualBuilder *builder)
41+
{
42+
reset_manual(builder);
43+
int screen[2] = {120, 500};
44+
set_manual_name(builder, "iPhone");
45+
set_manual_screen(builder, screen);
46+
set_manual_gpu_type(builder, 100);
47+
}
48+
49+
// 建造huwei manual手册
50+
void build_huawei_manual(ManualBuilder *builder)
51+
{
52+
reset_manual(builder);
53+
int screen[2] = {140, 600};
54+
set_manual_name(builder, "HuaweiPhone");
55+
set_manual_screen(builder, screen);
56+
set_manual_gpu_type(builder, 102);
57+
}
58+
59+
// 建造mi manual手册
60+
void build_mi_manual(ManualBuilder *builder)
61+
{
62+
reset_manual(builder);
63+
int screen[2] = {130, 550};
64+
set_manual_name(builder, "MiPhone");
65+
set_manual_screen(builder, screen);
66+
set_manual_gpu_type(builder, 103);
67+
}

builder-pattern/c/src/func.h

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// 定义手机创建者结构体,用来创建Phone对象
2+
typedef struct
3+
{
4+
char name[50];
5+
int screen[2];
6+
int gpu_type;
7+
} Phone;
8+
9+
// 定义手册创建者结构体,用来创建Manual对象
10+
typedef struct
11+
{
12+
char name[50];
13+
int screen[2];
14+
int gpu_type;
15+
} Manual;
16+
17+
// 定义手册创建者结构体,用来创建Manual对象
18+
typedef struct
19+
{
20+
Phone *phone;
21+
} PhoneBuilder;
22+
23+
// 定义手册创建者结构体,用来创建Manual对象
24+
typedef struct
25+
{
26+
Manual *manual;
27+
} ManualBuilder;
28+
29+
/* application.c 应用调用文件 */
30+
void make_iphone();
31+
void make_huawei_phone();
32+
void print_phone(Phone *phone);
33+
void print_manual(Manual *manual);
34+
35+
/* director.c 指挥者文件 */
36+
void build_iphone(PhoneBuilder *builder);
37+
// 建造phone的huwei phone
38+
void build_huawei_phone(PhoneBuilder *builder);
39+
// 建造phone的mi phone
40+
void build_mi_phone(PhoneBuilder *builder);
41+
// 建造iphone手册
42+
void build_iphone_manual(ManualBuilder *builder);
43+
// 建造huwei manual手册
44+
void build_huawei_manual(ManualBuilder *builder);
45+
// 建造mi manual手册
46+
void build_mi_manual(ManualBuilder *builder);
47+
48+
/* phone_builder.c 手机创建者文件 */
49+
PhoneBuilder *create_phone_builder();
50+
void reset_phone(PhoneBuilder *builder);
51+
Phone *get_phone_product(PhoneBuilder *builder);
52+
void free_phone_builder(PhoneBuilder *builder);
53+
void set_phone_name(PhoneBuilder *p, char *name);
54+
char *get_phone_name(PhoneBuilder *p);
55+
void set_phone_screen(PhoneBuilder *p, int *screen);
56+
int *get_phone_screen(PhoneBuilder *p);
57+
void set_phone_gpu_type(PhoneBuilder *p, int gpu_type);
58+
int get_phone_gpu_type(PhoneBuilder *p);
59+
60+
/* manual_builder.c 手机创建者文件 */
61+
ManualBuilder *create_manual_builder();
62+
void reset_manual(ManualBuilder *builder);
63+
Manual *get_manual_product(ManualBuilder *builder);
64+
void free_manual_builder(ManualBuilder *builder);
65+
void set_manual_name(ManualBuilder *p, char *name);
66+
char *get_manual_name(ManualBuilder *p);
67+
void set_manual_screen(ManualBuilder *p, int *screen);
68+
int *get_manual_screen(ManualBuilder *p);
69+
void set_manual_gpu_type(ManualBuilder *p, int gpu_type);
70+
int get_manual_gpu_type(ManualBuilder *p);

builder-pattern/c/src/manual.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// 定义Manual结构体,放在head
2+
// typedef struct
3+
// {
4+
// char name[50];
5+
// int screen[2];
6+
// int gpu_type;
7+
// } Manual;
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <string.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include "func.h"
5+
6+
/* 手册建造者 */
7+
8+
// 初始化ManualBuilder对象
9+
ManualBuilder *create_manual_builder()
10+
{
11+
ManualBuilder *builder = (ManualBuilder *)malloc(sizeof(ManualBuilder));
12+
builder->manual = NULL;
13+
return builder;
14+
}
15+
16+
void reset_manual(ManualBuilder *builder)
17+
{
18+
// 初始化Phone对象
19+
Manual *manual = (Manual *)malloc(sizeof(Manual));
20+
manual->name[0] = '\0';
21+
int screen_len = (int)sizeof(manual->screen) / sizeof(manual->screen[0]);
22+
for (int i = 0; i < screen_len; i++)
23+
{
24+
manual->screen[i] = 0;
25+
}
26+
manual->gpu_type = 0;
27+
builder->manual = manual;
28+
}
29+
30+
Manual *get_manual_product(ManualBuilder *builder)
31+
{
32+
return builder->manual;
33+
}
34+
35+
void free_manual_builder(ManualBuilder *builder)
36+
{
37+
free(builder);
38+
}
39+
40+
void set_manual_name(ManualBuilder *builder, char *name)
41+
{
42+
strncpy(builder->manual->name, name, 50);
43+
}
44+
45+
char *get_manual_name(ManualBuilder *builder)
46+
{
47+
return builder->manual->name;
48+
}
49+
50+
void set_manual_screen(ManualBuilder *builder, int *screen)
51+
{
52+
int screen_len = (int)sizeof(screen) / sizeof(screen[0]);
53+
memcpy(builder->manual->screen, screen, screen_len * sizeof(int));
54+
}
55+
56+
int *get_manual_screen(ManualBuilder *builder)
57+
{
58+
return builder->manual->screen;
59+
}
60+
61+
void set_manual_gpu_type(ManualBuilder *builder, int gpu_type)
62+
{
63+
builder->manual->gpu_type = gpu_type;
64+
}
65+
66+
int get_manual_gpu_type(ManualBuilder *builder)
67+
{
68+
return builder->manual->gpu_type;
69+
}

builder-pattern/c/src/phone.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// 定义Phone结构体,放在head
2+
// typedef struct
3+
// {
4+
// char name[50];
5+
// int screen[2];
6+
// int gpu_type;
7+
// } Phone;
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include <string.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include "func.h"
5+
6+
/* 手机建造者 */
7+
8+
// 初始化PhoneBuilder对象以及Phone数据
9+
PhoneBuilder *create_phone_builder()
10+
{
11+
// 申请PhoneBuilder空间
12+
PhoneBuilder *builder = (PhoneBuilder *)malloc(sizeof(PhoneBuilder));
13+
builder->phone = NULL;
14+
return builder;
15+
}
16+
17+
void reset_phone(PhoneBuilder *builder)
18+
{
19+
// 初始化Phone对象
20+
Phone *phone = (Phone *)malloc(sizeof(Phone));
21+
phone->name[0] = '\0';
22+
int screen_len = (int)sizeof(phone->screen) / sizeof(phone->screen[0]);
23+
for (int i = 0; i < screen_len; i++)
24+
{
25+
phone->screen[i] = 0;
26+
}
27+
phone->gpu_type = 0;
28+
builder->phone = phone;
29+
}
30+
31+
Phone *get_phone_product(PhoneBuilder *builder)
32+
{
33+
return builder->phone;
34+
}
35+
36+
void free_phone_builder(PhoneBuilder *builder)
37+
{
38+
free(builder);
39+
}
40+
41+
void set_phone_name(PhoneBuilder *builder, char *name)
42+
{
43+
strncpy(builder->phone->name, name, 50);
44+
}
45+
46+
char *get_phone_name(PhoneBuilder *builder)
47+
{
48+
return builder->phone->name;
49+
}
50+
51+
void set_phone_screen(PhoneBuilder *builder, int *screen)
52+
{
53+
int screen_len = (int)sizeof(screen) / sizeof(screen[0]);
54+
memcpy(builder->phone->screen, screen, screen_len * sizeof(int));
55+
}
56+
57+
int *get_phone_screen(PhoneBuilder *builder)
58+
{
59+
return builder->phone->screen;
60+
}
61+
62+
void set_phone_gpu_type(PhoneBuilder *builder, int gpu_type)
63+
{
64+
builder->phone->gpu_type = gpu_type;
65+
}
66+
67+
int get_phone_gpu_type(PhoneBuilder *builder)
68+
{
69+
return builder->phone->gpu_type;
70+
}

0 commit comments

Comments
 (0)