工厂模式
1. 什么是工厂模式
Factory Pattern,属于创建型模式,它不会对用户暴露创建的逻辑。而是使用一个共同的接口来指向新创建的对象。
2. 工厂模式解决了什么问题
解决了接口的选择问题,我们现在只需要知道要获取的类名称,然后从工厂中直接获取就可以。在生成复杂对象时,可以使用工厂模式,这样用户就不必理解复杂对象的创建过程,只需要获取对象,并使用即可。
2.1 工厂模式优点
- 简化获取对象流程,当我们想要获取一个对象时,只需要知道对象的名称,直接从工厂中获取就行。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以了。
- 屏蔽了产品的具体实现,调用者只关心接口就行。
2.2 工厂模式缺点
- 每增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中的类增加,在一定程度上增加了系统的复杂度。
3. 工厂模式的实现
3.1 创建一个模型接口
这个接口有一个Draw方法,所有的模型类都会实现这一个方法。
//Shape 模型接口
type Shape interface {
Draw()
}
3.2 创建三个模型类
这三个模型类实现了Shape的接口,我们用一个工厂,将其创建过程封装在工厂中。
//Circle 圆形类
type Circle struct{}
//Square 正方形类
type Square struct{}
//Rectangle 矩形类
type Rectangle struct{}
圆形类的方法实现:
//NewCircle 实例化Circle类
func NewCircle() *Circle {
return &Circle{}
}
//Draw Circle实现Shape接口的Draw方法
func (c *Circle) Draw() {
fmt.Println("Circle Draw() method.")
}
3.3 创建模型工厂
//ShapeFactory 模型工厂类
type ShapeFactory struct{}
//NewShapeFactory 实例化模型工厂
func NewShapeFactory() *ShapeFactory {
return &ShapeFactory{}
}
//GetShape 从模型工厂获取指定的模型类
func (sf *ShapeFactory) GetShape(shapeType string) Shape {
switch shapeType {
case "circle":
return NewCircle()
case "square":
return NewSquare()
case "rectangle":
return NewRectangle()
default:
return nil
}
}
在模型工厂中GetShape(shapeType string) Shape
函数可以通过模型的名称,获取具体的模型类。因为所有的模型类都实现了Shape接口的Draw方法,所以他们都可以作为Shape类型来赋值。