Skip to main content

设计模式之通用工厂模式

背景说明

tip

在定时任务和积分系统中都有用到
定时任务中,通过不同的参数返回实现了相同接口的对象,然后在入口处统一调用run方法执行
积分系统中,不同参数得到不同任务,但是都需要统一算分的接口,
因此通过工厂方法初始化相同接口对象,在入口处统一使用CalcPoints方法

典型代码

package main

import "fmt"

// 产品接口
type Product interface {
Use() string
}

// 具体产品A
type ProductA struct{}

func (p *ProductA) Use() string {
return "使用产品A"
}

// 具体产品B
type ProductB struct{}

func (p *ProductB) Use() string {
return "使用产品B"
}

// 工厂类
type Factory struct{}

func (f *Factory) CreateProduct(productType string) Product {
switch productType {
case "A":
return &ProductA{}
case "B":
return &ProductB{}
default:
return nil
}
}

func main() {
factory := &Factory{}

diffType := "A"
product := factory.CreateProduct(diffType)
fmt.Println(product.Use())

}

优缺点

优点

  1. 通过工厂方法初始化对象,减少了对象的初始化耦合,扩展性更好
  2. 通过接口编程,使得不同的实现类都能够执行相同的方法,使得代码更加规范化
  3. 工厂方法可以根据不同的参数返回不同的实现类,使得代码更加灵活

缺点

  1. 工厂方法初始化对象时需要判断类型,如果类型过多,需要不断增加判断条件,使得代码更加臃肿
  2. 工厂方法初始化对象时需要知道具体的实现类,使得代码耦合度增加

DDD 领域服务

涉及到多个Entity(task,PointDetail)状态改变的服务,被成为Domain Service Domain Service 主要用于封装多Entity或者跨业务域的逻辑

评论区