Skip to content

Commit c7b6273

Browse files
author
Jarry
committed
add chain call
1 parent 30f89e3 commit c7b6273

29 files changed

+471
-127
lines changed

builder-pattern/README.md

Lines changed: 316 additions & 17 deletions
Large diffs are not rendered by default.

builder-pattern/c/src/director.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@ void build_huawei_phone(Builder *builder)
2727
{
2828
builder->reset(builder);
2929
int screen[2] = {140, 600};
30-
builder->set_name(builder, "HuaweiPhone");
31-
builder->set_screen(builder, screen);
32-
builder->set_gpu_type(builder, 102);
30+
// 也可以链式调用
31+
builder->set_name(builder, "HuaweiPhone")
32+
->set_screen(builder, screen)
33+
->set_gpu_type(builder, 102);
3334
printf("build_huawei_phone:[name=%s]", builder->get_name(builder));
3435
}
3536

builder-pattern/c/src/func.h

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
typedef struct Builder Builder;
2+
typedef struct PhoneBuilder PhoneBuilder;
3+
typedef struct ManualBuilder ManualBuilder;
4+
typedef struct Phone Phone;
5+
typedef struct Manual Manual;
6+
17
// 定义手机创建者结构体,用来创建Phone对象
28
typedef struct Phone
39
{
@@ -20,10 +26,10 @@ typedef struct Builder
2026
struct Phone *phone;
2127
struct Manual *manual;
2228
void (*reset)(struct Builder *);
23-
void (*set_name)(struct Builder *, char *);
29+
Builder *(*set_name)(struct Builder *, char *);
2430
char *(*get_name)(struct Builder *);
25-
void (*set_screen)(struct Builder *, int *);
26-
void (*set_gpu_type)(struct Builder *, int);
31+
Builder *(*set_screen)(struct Builder *, int *);
32+
Builder *(*set_gpu_type)(struct Builder *, int);
2733
} Builder;
2834

2935
// 定义手机创建者结构体,与Builder对齐
@@ -32,10 +38,10 @@ typedef struct PhoneBuilder
3238
struct Phone *phone;
3339
struct Manual *manual;
3440
void (*reset)(struct Builder *);
35-
void (*set_name)(struct Builder *, char *);
41+
Builder *(*set_name)(struct Builder *, char *);
3642
char *(*get_name)(struct Builder *);
37-
void (*set_screen)(struct Builder *, int *);
38-
void (*set_gpu_type)(struct Builder *, int);
43+
Builder *(*set_screen)(struct Builder *, int *);
44+
Builder *(*set_gpu_type)(struct Builder *, int);
3945
struct Phone *(*get_product)(struct PhoneBuilder *);
4046
} PhoneBuilder;
4147

@@ -45,10 +51,10 @@ typedef struct ManualBuilder
4551
struct Phone *phone;
4652
struct Manual *manual;
4753
void (*reset)(struct Builder *);
48-
void (*set_name)(struct Builder *, char *);
54+
Builder *(*set_name)(struct Builder *, char *);
4955
char *(*get_name)(struct Builder *);
50-
void (*set_screen)(struct Builder *, int *);
51-
void (*set_gpu_type)(struct Builder *, int);
56+
Builder *(*set_screen)(struct Builder *, int *);
57+
Builder *(*set_gpu_type)(struct Builder *, int);
5258
struct Manual *(*get_product)(struct ManualBuilder *);
5359
} ManualBuilder;
5460

builder-pattern/c/src/manual_builder.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,31 @@ void reset_manual(Builder *builder)
1919
builder->manual = manual;
2020
}
2121

22-
void set_manual_name(Builder *builder, char *name)
22+
Builder * set_manual_name(Builder *builder, char *name)
2323
{
2424
char display_name[50] = "Manual:";
2525
strcat(display_name, name);
2626

2727
strncpy(builder->manual->name, display_name, 50);
28+
return builder;
2829
}
2930

3031
char *get_manual_name(Builder *builder)
3132
{
3233
return builder->manual->name;
3334
}
3435

35-
void set_manual_screen(Builder *builder, int *screen)
36+
Builder * set_manual_screen(Builder *builder, int *screen)
3637
{
3738
int screen_len = (int)sizeof(screen) / sizeof(screen[0]);
3839
memcpy(builder->manual->screen, screen, screen_len * sizeof(int));
40+
return builder;
3941
}
4042

41-
void set_manual_gpu_type(Builder *builder, int gpu_type)
43+
Builder * set_manual_gpu_type(Builder *builder, int gpu_type)
4244
{
4345
builder->manual->gpu_type = gpu_type;
46+
return builder;
4447
}
4548

4649
Manual *get_manual_product(ManualBuilder *builder)

builder-pattern/c/src/phone_builder.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,31 @@ void reset_phone(Builder *builder)
1919
builder->phone = phone;
2020
}
2121

22-
void set_phone_name(Builder *builder, char *name)
22+
Builder *set_phone_name(Builder *builder, char *name)
2323
{
2424
char display_name[50] = "Phone:";
2525
strcat(display_name, name);
2626

2727
strncpy(builder->phone->name, display_name, 50);
28+
return builder;
2829
}
2930

3031
char *get_phone_name(Builder *builder)
3132
{
3233
return builder->phone->name;
3334
}
3435

35-
void set_phone_screen(Builder *builder, int *screen)
36+
Builder *set_phone_screen(Builder *builder, int *screen)
3637
{
3738
int screen_len = (int)sizeof(screen) / sizeof(screen[0]);
3839
memcpy(builder->phone->screen, screen, screen_len * sizeof(int));
40+
return builder;
3941
}
4042

41-
void set_phone_gpu_type(Builder *builder, int gpu_type)
43+
Builder *set_phone_gpu_type(Builder *builder, int gpu_type)
4244
{
4345
builder->phone->gpu_type = gpu_type;
46+
return builder;
4447
}
4548

4649
Phone *get_phone_product(PhoneBuilder *builder)

builder-pattern/c/test/test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ int main()
4343
}
4444

4545
/**
46-
jarry@jarrys-MacBook-Pro c % gcc src/*.c test/test.c
46+
jarry@jarrys-MacBook-Pro c % gcc src/全部.c test/test.c
4747
jarry@jarrys-MacBook-Pro c % ./a.out s
4848
test start:
4949
build_iphone:[name=Phone:iPhone]

builder-pattern/go/src/Builder.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package src
33
// 建造者的基础接口
44
type Builder interface {
55
Reset()
6-
SetName(name string)
7-
SetScreen(size []int)
8-
SetGPU(no int)
6+
SetName(name string) Builder
7+
SetScreen(size []int) Builder
8+
SetGPU(no int) Builder
99
}

builder-pattern/go/src/Director.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ func (c *Director) BuildIPhone(builder Builder) {
1717
func (c *Director) BuildHuaweiPhone(builder Builder) {
1818
builder.Reset()
1919
var screen = []int{140, 600}
20-
builder.SetName("HuaweiPhone")
21-
builder.SetScreen(screen)
22-
builder.SetGPU(102)
20+
// 链式调用
21+
builder.SetName("HuaweiPhone").SetScreen(screen).SetGPU(102)
2322
}
2423

2524
// 建造phone3

builder-pattern/go/src/ManualBuilder.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@ func (m *ManualBuilder) Reset() {
88
m.manual = new(Manual)
99
}
1010

11-
func (m *ManualBuilder) SetName(name string) {
11+
func (m *ManualBuilder) SetName(name string) Builder {
1212
m.manual.SetName(name)
13+
return (Builder)(m)
1314
}
1415

15-
func (m *ManualBuilder) SetScreen(screen []int) {
16+
func (m *ManualBuilder) SetScreen(screen []int) Builder {
1617
m.manual.SetScreen(screen)
18+
return (Builder)(m)
1719
}
1820

19-
func (m *ManualBuilder) SetGPU(no int) {
21+
func (m *ManualBuilder) SetGPU(no int) Builder {
2022
m.manual.SetGpuType(no)
23+
return (Builder)(m)
2124
}
2225

2326
func (m *ManualBuilder) GetProduct() *Manual {

builder-pattern/go/src/PhoneBuilder.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@ func (p *PhoneBuilder) Reset() {
88
p.phone = new(Phone)
99
}
1010

11-
func (p *PhoneBuilder) SetName(name string) {
11+
func (p *PhoneBuilder) SetName(name string) Builder {
1212
p.phone.SetName(name)
13+
return (Builder)(p)
1314
}
1415

15-
func (p *PhoneBuilder) SetScreen(screen []int) {
16+
func (p *PhoneBuilder) SetScreen(screen []int) Builder {
1617
p.phone.SetScreen(screen)
18+
return (Builder)(p)
1719
}
1820

19-
func (p *PhoneBuilder) SetGPU(no int) {
21+
func (p *PhoneBuilder) SetGPU(no int) Builder {
2022
p.phone.SetGpuType(no)
23+
return (Builder)(p)
2124
}
2225

2326
func (p *PhoneBuilder) GetProduct() *Phone {

builder-pattern/java/src/Builder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// 建造者接口
44
public interface Builder {
55
public void reset();
6-
public void setName(String name);
7-
public void setScreen(Integer[] screen);
8-
public void setGPU(Integer no);
6+
public Builder setName(String name);
7+
public Builder setScreen(Integer[] screen);
8+
public Builder setGPU(Integer no);
99
}

builder-pattern/java/src/Director.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ public void buildIPhone(Builder builder) {
1616
public void buildHuaweiPhone(Builder builder) {
1717
builder.reset();
1818
Integer[] screen = { 130, 600 };
19-
builder.setName("HuaweiPhone");
20-
builder.setScreen(screen);
21-
builder.setGPU(102);
19+
// 也可以链式调用
20+
builder.setName("HuaweiPhone")
21+
.setScreen(screen)
22+
.setGPU(102);
2223
}
2324

2425
// 建造phone3

builder-pattern/java/src/Manual.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package src;
22

3+
import java.util.Arrays;
4+
35
// 手册类
46
public class Manual {
57
private String name = "PhoneManualName";
@@ -40,7 +42,7 @@ public Integer getPages() {
4042
}
4143

4244
public String toString() {
43-
return "[name=" + name + ", screen=" + screen.toString() + ", gpuType=" + gpuType + "]";
45+
return "[name=" + name + ", screen=" + Arrays.toString(screen) + ", gpuType=" + gpuType + "]";
4446
}
4547

4648
}

builder-pattern/java/src/ManualBuilder.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@ public void reset() {
88
this.manual = new Manual();
99
}
1010

11-
public void setName(String name) {
11+
public Builder setName(String name) {
1212
this.manual.setName(name);
13+
return this;
1314
}
1415

15-
public void setScreen(Integer[] screen) {
16+
public Builder setScreen(Integer[] screen) {
1617
this.manual.setScreen(screen);
18+
return this;
1719
}
1820

19-
public void setGPU(Integer no) {
21+
public Builder setGPU(Integer no) {
2022
this.manual.setGpuType(no);
23+
return this;
2124
}
2225

2326
public Manual getProduct() {

builder-pattern/java/src/Phone.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package src;
22

3+
import java.util.Arrays;
4+
35
// 产品类
46
public class Phone {
57
private String name = "PhoneName";
@@ -31,7 +33,7 @@ public Integer getGpuType() {
3133
}
3234

3335
public String toString() {
34-
return "[name=" + name + ", screen=" + screen.toString() + ", gpuType=" + gpuType + "]";
36+
return "[name=" + name + ", screen=" + Arrays.toString(screen) + ", gpuType=" + gpuType + "]";
3537
}
3638

3739
}

builder-pattern/java/src/PhoneBuilder.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@ public void reset() {
88
this.phone = new Phone();
99
}
1010

11-
public void setName(String name) {
11+
public Builder setName(String name) {
1212
this.phone.setName(name);
13+
return this;
1314
}
1415

15-
public void setScreen(Integer[] screen) {
16+
public Builder setScreen(Integer[] screen) {
1617
this.phone.setScreen(screen);
18+
return this;
1719
}
1820

19-
public void setGPU(Integer no) {
21+
public Builder setGPU(Integer no) {
2022
this.phone.setGpuType(no);
23+
return this;
2124
}
2225

2326
public Phone getProduct() {

builder-pattern/java/test/Test.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,10 @@ public static void main(String[] args) {
4949
* jarry@jarrys-MacBook-Pro java % javac test/Test.java
5050
* jarry@jarrys-MacBook-Pro java % java test/Test
5151
* test start:
52-
* iPhone:iPhone | [name=iPhone, screen=[Ljava.lang.Integer;@7e9e5f8a,
53-
* gpuType=100]
54-
* manual:iPhone | [name=iPhone, screen=[Ljava.lang.Integer;@4554617c,
55-
* gpuType=100]
56-
* huaweiPhone:HuaweiPhone | [name=HuaweiPhone,
57-
* screen=[Ljava.lang.Integer;@74a14482, gpuType=102]
58-
* manual:HuaweiPhone | [name=HuaweiPhone, screen=[Ljava.lang.Integer;@1540e19d,
59-
* gpuType=102]
52+
* iPhone:iPhone | [name=iPhone, screen=[120, 500], gpuType=100]
53+
* manual:iPhone | [name=iPhone, screen=[120, 500], gpuType=100]
54+
* huaweiPhone:HuaweiPhone | [name=HuaweiPhone, screen=[130, 600], gpuType=102]
55+
* manual:HuaweiPhone | [name=HuaweiPhone, screen=[130, 600], gpuType=102]
6056
* miPhone:MiPhone | 103
6157
* manual:MiPhone | 103
6258
*/

builder-pattern/js/src/Director.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ export class Director {
2222
buildMiPhone(builder) {
2323
builder.reset()
2424
const screen = [130, 550]
25+
// 链式调用
2526
builder.setName('MiPhone')
26-
builder.setScreen(screen)
27-
builder.setGPU(103)
27+
.setScreen(screen)
28+
.setGPU(103)
2829
}
29-
}
30+
}

builder-pattern/js/src/ManualBuilder.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@ export class ManualBuilder extends Builder {
1313

1414
setName(name) {
1515
this.manual.setName(name)
16+
return this
1617
}
1718

1819
setScreen(screen) {
1920
this.manual.setScreen(screen)
21+
return this
2022
}
2123

2224
setGPU(no) {
2325
this.manual.setGpuType(no)
26+
return this
2427
}
2528

2629
getProduct() {

builder-pattern/js/src/PhoneBuilder.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@ export class PhoneBuilder extends Builder {
1313

1414
setName(name) {
1515
this.phone.setName(name)
16+
return this
1617
}
1718

1819
setScreen(screen) {
1920
this.phone.setScreen(screen)
21+
return this
2022
}
2123

2224
setGPU(no) {
2325
this.phone.setGpuType(no)
26+
return this
2427
}
2528

2629
getProduct() {

0 commit comments

Comments
 (0)