http://tigerb.cn/

我的代码没有else系列-简单工厂

结合实际业务谈设计模式

业务场景

1
2
调用一个服务生成静态页面
不同的页面拥有不同的模块

不同的页面的数据结构不一样
生成不同的页面对象

正常代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

import "fmt"

const (
// CartConst 购物车列表页面
CartConst = "cart/list"
// ProductConst 商品列表页面
ProductConst = "product/list"
)

// Context 请求上下文
type Context struct {
URI string
}

// PageInterface PageInterface
type PageInterface interface {
MakeData(c *Context) (interface{}, error)
}

// Cart 购物车页面数据对象
type Cart struct {
header interface{}

footer interface{}
}

// MakeData 构建数据对象
func (Cart *Cart) MakeData(c *Context) (interface{}, error) {
// 构建数据的页面代码...
fmt.Println("生成购物车静态页面数据对象...")
return Cart, nil
}

// Product Spu页面数据对象
type Product struct {
header interface{}

footer interface{}
}

// MakeData 构建数据对象
func (Product *Product) MakeData(c *Context) (interface{}, error) {
// 构建数据的页面代码...
fmt.Println("生成spu详情静态页面数据对象...")
return Product, nil
}

func main() {
c := &Context{
URI: "cart/list",
}
var pageObject PageInterface
switch c.URI {
case CartConst:
pageObject = &Cart{}
case ProductConst:
pageObject = &Product{}

default:
panic("不支持的页面")
}

pageObject.MakeData(c)
}

简单工厂模式的概念
简单理解,一句话:

统一封装生产对象的过程

简单工厂模式下的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package main

//------------------------------------------------------------
//我的代码没有`else`系列
//简单工厂模式
//@auhtor TIGERB<https://github.com/TIGERB>
//------------------------------------------------------------

import "fmt"

const (
// CartConst 购物车列表页面
CartConst = "cart/list"
// ProductConst 商品列表页面
ProductConst = "product/list"
)

// Context 请求上下文
type Context struct {
URI string
}

// PageInterface PageInterface
type PageInterface interface {
MakeData(c *Context) (interface{}, error)
}

// Cart 购物车页面数据对象
type Cart struct {
header interface{}
footer interface{}
}

// MakeData 构建数据对象
func (Cart *Cart) MakeData(c *Context) (interface{}, error) {
// 构建数据的页面代码...
fmt.Println("生成购物车静态页面数据对象...")
return Cart, nil
}

// Product Spu页面数据对象
type Product struct {
header interface{}
footer interface{}
}

// MakeData 构建数据对象
func (Product *Product) MakeData(c *Context) (interface{}, error) {
// 构建数据的页面代码...
fmt.Println("生成spu详情静态页面数据对象...")
return Product, nil
}

// PageFactory 构建页面对象的简单工厂
type PageFactory struct {
Ctx *Context
}

// Get 获取对象
func (p *PageFactory) Get() PageInterface {
switch p.Ctx.URI {
case CartConst:
return &Cart{}
case ProductConst:
return &Product{}

default:
panic("不支持的页面")
}
}

// 客户端使用示例
func main() {
ctx := &Context{
URI: "cart/list",
}
pageFactory := &PageFactory{
Ctx: ctx,
}
pageFactory.Get().MakeData(ctx)
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main

//------------------------------------------------------------
//我的代码没有`else`系列
//工厂模式
//@auhtor TIGERB<https://github.com/TIGERB>
//------------------------------------------------------------

import "fmt"

const (
// CartConst 购物车列表页面
CartConst = "cart/list"
// ProductConst 商品列表页面
ProductConst = "product/list"
)

// Context 请求上下文
type Context struct {
URI string
}

// PageInterface PageInterface
type PageInterface interface {
MakeData(c *Context) (interface{}, error)
}

// Cart 购物车页面数据对象
type Cart struct {
header interface{}
footer interface{}
}

// MakeData 构建数据对象
func (Cart *Cart) MakeData(c *Context) (interface{}, error) {
// 构建数据的页面代码...
fmt.Println("生成购物车静态页面数据对象...")
return Cart, nil
}

// Product Spu页面数据对象
type Product struct {
header interface{}
footer interface{}
}

// MakeData 构建数据对象
func (Product *Product) MakeData(c *Context) (interface{}, error) {
// 构建数据的页面代码...
fmt.Println("生成spu详情静态页面数据对象...")
return Product, nil
}

// PageFactoryInterface 页面简单工厂接口
type PageFactoryInterface interface {
Get() PageInterface
}

// CartPageFactory 构建购物车页面对象的简单工厂
type CartPageFactory struct {
Ctx *Context
}

// Get 获取对象
func (p *CartPageFactory) Get() PageInterface {
return &Cart{}
}

// ProductPageFactory 构建购物车页面对象的简单工厂
type ProductPageFactory struct {
Ctx *Context
}

// Get 获取对象
func (p *ProductPageFactory) Get() PageInterface {
return &Cart{}
}

// 客户端使用示例
func main() {
ctx := &Context{}

// 生成购物车页面数据对象
(&CartPageFactory{
Ctx: ctx,
}).Get().MakeData(ctx)

// 生成spu详情页面数据对象
(&ProductPageFactory{
Ctx: ctx,
}).Get().MakeData(ctx)
}

抽象工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main

//------------------------------------------------------------
//我的代码没有`else`系列
//抽象工厂模式
//@auhtor TIGERB<https://github.com/TIGERB>
//------------------------------------------------------------

import "fmt"

const (
// CartConst 购物车列表页面
CartConst = "cart/list"
// ProductConst 商品列表页面
ProductConst = "product/list"
)

// Context 请求上下文
type Context struct {
URI string
}

// PageInterface PageInterface
type PageInterface interface {
MakeData(c *Context) (interface{}, error)
}

// Cart 购物车页面数据对象
type Cart struct {
header interface{}
footer interface{}
}

// MakeData 构建数据对象
func (Cart *Cart) MakeData(c *Context) (interface{}, error) {
// 构建数据的页面代码...
fmt.Println("生成购物车静态页面数据对象...")
return Cart, nil
}

// Product Spu页面数据对象
type Product struct {
header interface{}
footer interface{}
}

// MakeData 构建数据对象
func (Product *Product) MakeData(c *Context) (interface{}, error) {
// 构建数据的页面代码...
fmt.Println("生成spu详情静态页面数据对象...")
return Product, nil
}

// PageFactoryInterface 页面简单工厂接口
type PageFactoryInterface interface {
Get() PageInterface
}

// CartPageFactory 构建购物车页面对象的简单工厂
type CartPageFactory struct {
Ctx *Context
}

// Get 获取对象
func (p *CartPageFactory) Get() PageInterface {
return &Cart{}
}

// ProductPageFactory 构建购物车页面对象的简单工厂
type ProductPageFactory struct {
Ctx *Context
}

// Get 获取对象
func (p *ProductPageFactory) Get() PageInterface {
return &Cart{}
}

// 客户端使用示例
func main() {
ctx := &Context{}

// 生成购物车页面数据对象
(&CartPageFactory{
Ctx: ctx,
}).Get().MakeData(ctx)

// 生成spu详情页面数据对象
(&ProductPageFactory{
Ctx: ctx,
}).Get().MakeData(ctx)
}