工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
使用场景
工厂方法模式适用于以下场景:
- 对象的创建延迟到子类中: 当一个类无法预先知道它必须创建的对象的具体类型时,它可以将对象的创建延迟到子类中。工厂方法模式允许每个子类负责创建特定类型的对象,从而提高了系统的灵活性和可扩展性。
- 避免暴露对象的创建逻辑: 工厂方法模式可以将对象的创建逻辑封装在一个单独的工厂类中,客户端无需了解对象的具体创建细节,只需要通过工厂方法获取所需的对象即可。这样可以降低客户端与具体类之间的耦合度,提高系统的可维护性和可扩展性。
- 支持多种产品类型: 当一个类需要创建多种类型的产品对象时,可以使用工厂方法模式来为每种产品类型定义一个工厂方法,从而实现多态的产品对象创建。
- 需要统一管理对象创建过程: 在某些情况下,需要对对象的创建过程进行统一管理,例如对对象进行缓存、池化或者其他管理操作时,可以使用工厂方法模式来封装对象的创建过程,并提供统一的接口供客户端使用。
- 需要在运行时动态决定对象的类型: 当对象的具体类型在运行时才能确定时,可以使用工厂方法模式来根据条件动态选择合适的工厂方法来创建对象,从而实现更灵活的对象创建过程。
代码实现
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"
type IComputer interface { Compute() string }
type Computer struct { name string }
func (c *Computer) Compute() string { return c.name + "-Compute" }
type IComputerFactory interface { Produce() IComputer }
type LenovoComputerFactory struct{}
func (f *LenovoComputerFactory) Produce() IComputer { return &Computer{name: "Lenovo"} }
type DellComputerFactory struct{}
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()) }
|
结语
工厂方法模式是一种常用的设计模式,它将对象的创建过程封装在工厂接口中,客户端通过调用工厂方法来创建具体的对象,从而实现了对象的创建与使用的解耦。
总的来说,工厂方法模式可以帮助我们实现更灵活、可扩展、易维护的代码结构,提高了代码的复用性和可维护性,是一种值得推荐的设计模式。