工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

使用场景

工厂方法模式适用于以下场景:

  1. 对象的创建延迟到子类中: 当一个类无法预先知道它必须创建的对象的具体类型时,它可以将对象的创建延迟到子类中。工厂方法模式允许每个子类负责创建特定类型的对象,从而提高了系统的灵活性和可扩展性。
  2. 避免暴露对象的创建逻辑: 工厂方法模式可以将对象的创建逻辑封装在一个单独的工厂类中,客户端无需了解对象的具体创建细节,只需要通过工厂方法获取所需的对象即可。这样可以降低客户端与具体类之间的耦合度,提高系统的可维护性和可扩展性。
  3. 支持多种产品类型: 当一个类需要创建多种类型的产品对象时,可以使用工厂方法模式来为每种产品类型定义一个工厂方法,从而实现多态的产品对象创建。
  4. 需要统一管理对象创建过程: 在某些情况下,需要对对象的创建过程进行统一管理,例如对对象进行缓存、池化或者其他管理操作时,可以使用工厂方法模式来封装对象的创建过程,并提供统一的接口供客户端使用。
  5. 需要在运行时动态决定对象的类型: 当对象的具体类型在运行时才能确定时,可以使用工厂方法模式来根据条件动态选择合适的工厂方法来创建对象,从而实现更灵活的对象创建过程。

代码实现

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main

import "fmt"

// IComputer 是电脑产品接口
type IComputer interface {
Compute() string
}

type Computer struct {
name string
}

func (c *Computer) Compute() string {
return c.name + "-Compute"
}

// IComputerFactory 是电脑工厂接口
type IComputerFactory interface {
Produce() IComputer
}

// LenovoComputerFactory 是联想电脑工厂,实现了 ComputerFactory 接口
type LenovoComputerFactory struct{}

// Produce 实现了 ComputerFactory 接口中的 Produce 方法
func (f *LenovoComputerFactory) Produce() IComputer {
return &Computer{name: "Lenovo"}
}

// DellComputerFactory 是戴尔电脑工厂,实现了 ComputerFactory 接口
type DellComputerFactory struct{}

// Produce 实现了 ComputerFactory 接口中的 Produce 方法
func (f *DellComputerFactory) Produce() IComputer {
return &Computer{name: "Dell"}
}

func main() {
// 创建联想电脑工厂
lenovoFactory := &LenovoComputerFactory{}
// 生产联想电脑
lenovoComputer := lenovoFactory.Produce()
// 使用联想电脑
fmt.Println(lenovoComputer.Compute())

// 创建戴尔电脑工厂
dellFactory := &DellComputerFactory{}
// 生产戴尔电脑
dellComputer := dellFactory.Produce()
// 使用戴尔电脑
fmt.Println(dellComputer.Compute())
}

结语

工厂方法模式是一种常用的设计模式,它将对象的创建过程封装在工厂接口中,客户端通过调用工厂方法来创建具体的对象,从而实现了对象的创建与使用的解耦。
总的来说,工厂方法模式可以帮助我们实现更灵活、可扩展、易维护的代码结构,提高了代码的复用性和可维护性,是一种值得推荐的设计模式。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。