5. 工厂方法模式
5.1 工厂方法模式中的角色和职责
抽象工厂(Abstract Factory)角色:工厂方法模式的核心,任何工厂类都必须实现这个接口。
工厂(Concrete Factory)角色:具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
抽象产品(Abstract Product)角色:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:工厂方法模式所创建的具体实例对象。
5.2 工厂方法模式的实现
工厂方法模式的实现代码如下:
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 55 56 57 58 59 60 61 62 63 64
| package main
import "fmt"
type AbstractStationery interface { Show() }
type AbstractFactory interface { CreateStationery() AbstractStationery }
type ActualPencil struct { AbstractStationery }
func (stationery *ActualPencil) Show() { fmt.Println("生产铅笔") }
type ActualPen struct { AbstractStationery }
func (stationery *ActualPen) Show() { fmt.Println("生产钢笔") }
type PencilFactory struct { AbstractFactory }
func (pencil *PencilFactory) CreateStationery() AbstractStationery { return &ActualPencil{} }
type PenFactory struct { AbstractFactory }
func (pen *PenFactory) CreateStationery() AbstractStationery { return &ActualPen{} }
func main() { pencilFactory := new(PencilFactory) pencil := pencilFactory.CreateStationery() pencil.Show()
penFactory := new(PenFactory) pen := penFactory.CreateStationery() pen.Show()
}
|
上述代码是通过面向抽象层开发,业务逻辑层的main()函数逻辑,依然是只与工厂耦合,且只与抽象的工厂和抽象的水果类耦合,这样就遵循了面向抽象层接口编程的原则。
5.3 工厂方法模式的优缺点
优点:
- 不需要记住具体类名,甚至连具体参数都不用记忆。
- 实现了对象创建和使用的分离。
- 系统的可扩展性也就变得非常好,无需修改接口和原类。
- 对于新产品的创建,符合开闭原则。
缺点:
- 增加系统中类的个数,复杂度和理解度增加。
- 增加了系统的抽象性和理解难度。
适用场景:
- 客户端不知道它所需要的对象的类。
- 抽象工厂类通过其子类来指定创建哪个对象。