代码实现(以Go语言为例)
package main
import "fmt"
// Color结构体
type Color struct {
name string
}
// Circle结构体
type Circle struct {
color *Color
}
// 绘制圆形的方法
func (c *Circle) Draw() {
fmt.Printf("Drawing a %s circle\n", c.color.name)
}
// Shape接口
type Shape interface {
Draw()
}
// ShapeFactory类
type ShapeFactory struct{}
// 创建Shape的方法,这里实现创建Circle并注入Color
func (sf *ShapeFactory) CreateShape(shapeType string, color *Color) Shape {
if shapeType == "circle" {
return &Circle{color: color}
}
return nil
}
调用示例
func main() {
factory := &ShapeFactory{}
redColor := &Color{name: "red"}
circle := factory.CreateShape("circle", redColor)
circle.Draw()
}
依赖注入在这种场景下的优势
- 解耦依赖关系:
Circle
结构体不需要自己去创建或管理Color
实例,降低了Circle
与Color
创建逻辑的耦合度,使Circle
专注于自身的绘制逻辑。
- 提高可测试性:在测试
Circle
的绘制功能时,可以方便地注入一个模拟的Color
实例,而不需要依赖真实的Color
创建过程,从而更容易编写单元测试。
- 增强灵活性和可维护性:如果
Color
的创建逻辑发生变化,只需要在注入的地方修改,而不需要修改Circle
的内部代码。同时,不同的业务场景可以注入不同的Color
实例,提高了代码的灵活性。