工厂方法模式

2. 简单工厂

2.1 概述

指在不指定具体产品类的情况下,为相互关联的产品簇或产品集(Families of Products)提供创建接口,并向客户端隐藏具体产品创建的细节或表示的对象。

2.2 代码示例

  • deployment,daemonset,statefulset三个类,抽象出一个WorkLoad
  • 该类有一个创建工作负载方法,该方法根据条件返回WorkLoad的一个子类
  • 创建一个Option接口,对三个子类进行操作
package main
import "fmt"
type Option interface {
Create() string
}
type Deployment struct {
WorkLoad WorkLoad
}
func (deployment *Deployment) Create() string {
return fmt.Sprintf("假装创建了%q:%q", deployment.WorkLoad.Kind, deployment.WorkLoad.Name)
}
type Daemonset struct {
WorkLoad WorkLoad
}
func (daemonset *Daemonset) Create() string {
return fmt.Sprintf("假装创建了%q:%q", daemonset.WorkLoad.Kind, daemonset.WorkLoad.Name)
}
type Statefulset struct {
WorkLoad WorkLoad
}
func (statefulset *Statefulset) Create() string {
return fmt.Sprintf("假装创建了%q:%q", statefulset.WorkLoad.Kind, statefulset.WorkLoad.Name)
}
type WorkLoad struct {
Name string
Kind string
}
func (workLoad *WorkLoad) setWorkLoad() Option {
switch workLoad.Kind {
case "Deployment":
return &Deployment{
WorkLoad: *workLoad,
}
case "Daemonset":
return &Daemonset{
WorkLoad: *workLoad,
}
case "Statefulset":
return &Statefulset{
WorkLoad: *workLoad,
}
}
return nil
}
func main() {
//简单工厂使用代码
workLoad := &WorkLoad{
Name: "nginx",
Kind: "Deployment",
}
parse := workLoad.setWorkLoad()
if parse != nil {
data := parse.Create()
fmt.Println(data)
}
}
  • 输出
假装创建了"Deployment":"nginx"

2.3 类图

Deployment
-WorkLoad WorkLoad
+Create()
WorkLoad
+string Name
+string Kind
+Option setWorkLoad()
Daemenset
-WorkLoad WorkLoad
+Create()
Stagefulset
-WorkLoad WorkLoad
+Create()
«interface»
Option
+string Create()

3. 工厂模式

3.1 概述

工厂方法类定义产品对象创建接口,但由子类实现具体产品对象的创建。

3.2 代码示例

package main
import (
"fmt"
)
type Option interface {
Create() string
}
type Deployment struct {
Name string
Kind string
}
func (deployment *Deployment) Create() string {
return fmt.Sprintf("假装创建了%q:%q", deployment.Kind, deployment.Name)
}
type Daemonset struct {
Name string
Kind string
}
func (daemonset *Daemonset) Create() string {
return fmt.Sprintf("假装创建了%q:%q", daemonset.Kind, daemonset.Name)
}
type Statefulset struct {
Name string
Kind string
}
func (statefulset *Statefulset) Create() string {
return fmt.Sprintf("假装创建了%q:%q", statefulset.Kind, statefulset.Name)
}
type WorkLoad struct {
Name string
Kind string
}
type Set interface {
SetWorkLoad(workLoad *WorkLoad) Option
}
type SetDeployment struct {
}
func (jsonFactory *SetDeployment) SetWorkLoad(workLoad *WorkLoad) Option {
deployemnt := &Deployment{
Name: workLoad.Name,
Kind: workLoad.Kind,
}
return deployemnt
}
type SetDaemonset struct {
}
func (setDaemonset *SetDaemonset) SetWorkLoad(workLoad *WorkLoad) Option {
daemonset := &Deployment{
Name: workLoad.Name,
Kind: workLoad.Kind,
}
return daemonset
}
type SetStatefulset struct {
}
func (setStatefulset *SetStatefulset) SetWorkLoad(workLoad *WorkLoad) Option {
statefulset := &Statefulset{
Name: workLoad.Name,
Kind: workLoad.Kind,
}
return statefulset
}
func SetWorkLoad(workLoad *WorkLoad) Set {
switch workLoad.Kind {
case "Deployment":
return &SetDeployment{}
case "Daemonset":
return &SetDaemonset{}
case "Statefulset":
return &SetStatefulset{}
}
return nil
}
func main() {
workLoad := &WorkLoad{
Name: "nginx",
Kind: "Deployment",
}
workLoadKind := SetWorkLoad(workLoad)
workLoadConf := workLoadKind.SetWorkLoad(workLoad)
if workLoadConf != nil {
data := workLoadConf.Create()
fmt.Println(data)
}
}

3.3 类图

«interface»
Option
+string Create()
Deployment
+string Name
+string Kind
+Create()
Daemenset
+string Name
+string Kind
+Create()
Stagefulset
+string Name
+string Kind
+Create()
SetDeployment
+Option SetWorkLoad()
«interface»
Set
+string Create()
SetDaemenset
+Option SetWorkLoad()
SetStagefulset
+Option SetWorkLoad()

posted on   运维开发玄德公  阅读(16)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示