返回
工厂设计模式:三姐妹一网打尽
见解分享
2024-01-10 03:55:22
作为创建型设计模式,以工厂为名的设计模式共有三个,分别是 Simple Factory、Factory Method 和 Abstract Factory。其中 Simple Factory 并不是四人帮(GoF)著作中定义的模式,但却是最基础、最常用的,也是循序渐进地理解另外两个工厂模式的必经之路。
Simple Factory:工厂中的老大哥
Simple Factory 是最简单的工厂模式,它提供了一个创建对象的统一接口,屏蔽了具体产品的创建过程。其核心思想是将产品的创建逻辑集中在一个工厂类中,客户端只需通过工厂类即可创建所需的产品对象。
优点:
- 代码简单易懂,便于维护。
- 客户端无需关心具体产品的创建细节。
- 扩展性较好,添加新产品时只需修改工厂类即可。
缺点:
- 工厂类过于臃肿,当产品种类繁多时会难以管理。
- 无法控制产品创建过程的细节。
Factory Method:工厂中的抽象爸爸
Factory Method 模式将产品的创建过程抽象化,交由子类来实现。这样一来,客户端只需要知道工厂接口即可,而无需关心具体产品的创建方式。
优点:
- 解耦了产品的创建逻辑和客户端代码。
- 客户端只需关注工厂接口,扩展性好。
- 子类可以自由控制产品的创建过程。
缺点:
- 比 Simple Factory 模式复杂。
- 需要为每种产品创建一个子类,当产品种类繁多时会产生大量的子类。
Abstract Factory:工厂中的抽象全家桶
Abstract Factory 模式将创建一系列相关或依赖产品的接口抽象化。客户端只需要知道抽象工厂接口,即可创建一组相关的产品对象。
优点:
- 创建一组相关或依赖的产品更加方便。
- 解耦了产品的创建逻辑和客户端代码。
- 扩展性好,添加新产品系列时只需添加一个新的具体工厂类即可。
缺点:
- 比 Factory Method 模式更加复杂。
- 需要为每种产品系列创建一个具体工厂类和一系列具体产品类,当产品种类繁多时会产生大量的类。
何时选择哪种工厂模式?
三种工厂模式各有优缺点,选择哪种模式取决于具体的应用场景。
- 当产品种类较少且创建过程简单时,Simple Factory 模式是一个不错的选择。
- 当产品种类较多且需要控制创建过程的细节时,Factory Method 模式更为合适。
- 当需要创建一组相关或依赖的产品时,Abstract Factory 模式是最佳选择。
举个栗子
假设我们要设计一个创建形状对象的系统。我们可以使用三种工厂模式来实现:
Simple Factory:
type ShapeFactory struct{}
func (f *ShapeFactory) CreateShape(shapeType string) Shape {
switch shapeType {
case "circle":
return &Circle{}
case "square":
return &Square{}
case "rectangle":
return &Rectangle{}
default:
return nil
}
}
Factory Method:
type ShapeFactory interface {
CreateShape() Shape
}
type CircleFactory struct{}
func (f *CircleFactory) CreateShape() Shape {
return &Circle{}
}
type SquareFactory struct{}
func (f *SquareFactory) CreateShape() Shape {
return &Square{}
}
type RectangleFactory struct{}
func (f *RectangleFactory) CreateShape() Shape {
return &Rectangle{}
}
Abstract Factory:
type ShapeFactory interface {
CreateCircle() Circle
CreateSquare() Square
CreateRectangle() Rectangle
}
type DefaultShapeFactory struct{}
func (f *DefaultShapeFactory) CreateCircle() Circle {
return &Circle{}
}
func (f *DefaultShapeFactory) CreateSquare() Square {
return &Square{}
}
func (f *DefaultShapeFactory) CreateRectangle() Rectangle {
return &Rectangle{}
}
在上面的示例中,Simple Factory 提供了一个统一的创建形状对象的接口,客户端无需关心具体的创建过程。Factory Method 模式将创建过程抽象化,允许子类控制产品的创建细节。Abstract Factory 模式创建了一组相关的形状对象,客户端只需知道抽象工厂接口即可。
总结
工厂设计模式是创建型设计模式中的重要成员,它们提供了一种灵活、可扩展的方式来创建对象。通过深入理解三种工厂模式的优缺点,我们可以根据不同的应用场景选择最合适的模式。