package
0.0.0-20230827111118-13cf26d11498
Repository: https://github.com/tigerb/easy-tips.git
Documentation: pkg.go.dev

# README

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

结合实际业务谈设计模式

业务场景

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

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

正常代码

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)
}

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

统一封装生产对象的过程

简单工厂模式下的代码

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
}

type PageFactory struct{}


func main() {
	c := &Context{
		URI: "cart/list",
	}
	

	pageObject.MakeData(c)
}

# Constants

CartConst 购物车列表页面.
CartConst 购物车列表页面.
CartConst 购物车列表页面.
CartConst 购物车列表页面.
ProductConst 商品列表页面.
ProductConst 商品列表页面.
ProductConst 商品列表页面.
ProductConst 商品列表页面.

# Structs

Cart 购物车页面数据对象.
Cart 购物车页面数据对象.
Cart 购物车页面数据对象.
Cart 购物车页面数据对象.
CartPageFactory 构建购物车页面对象的简单工厂.
CartPageFactory 构建购物车页面对象的简单工厂.
Context 请求上下文.
Context 请求上下文.
Context 请求上下文.
Context 请求上下文.
PageFactory 构建页面对象的简单工厂.
Product Spu页面数据对象.
Product Spu页面数据对象.
Product Spu页面数据对象.
Product Spu页面数据对象.
ProductPageFactory 构建购物车页面对象的简单工厂.
ProductPageFactory 构建购物车页面对象的简单工厂.

# Interfaces

PageFactoryInterface 页面简单工厂接口.
PageFactoryInterface 页面简单工厂接口.
PageInterface PageInterface.
PageInterface PageInterface.
PageInterface PageInterface.
PageInterface PageInterface.