MST
星途 面试题库

面试题:Swift中依赖注入在工厂模式下的应用

在上述的工厂模式基础上,假设`Circle`结构体需要依赖一个`Color`结构体(有`name`属性)来绘制带颜色的圆形。请使用依赖注入的方式,在`ShapeFactory`类创建`Circle`实例时注入`Color`实例。同时说明依赖注入在这种场景下的优势。
34.0万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

代码实现(以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()
}

依赖注入在这种场景下的优势

  1. 解耦依赖关系Circle结构体不需要自己去创建或管理Color实例,降低了CircleColor创建逻辑的耦合度,使Circle专注于自身的绘制逻辑。
  2. 提高可测试性:在测试Circle的绘制功能时,可以方便地注入一个模拟的Color实例,而不需要依赖真实的Color创建过程,从而更容易编写单元测试。
  3. 增强灵活性和可维护性:如果Color的创建逻辑发生变化,只需要在注入的地方修改,而不需要修改Circle的内部代码。同时,不同的业务场景可以注入不同的Color实例,提高了代码的灵活性。