工厂模式
工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且时通过使用一个共同的接口来执行新的创建的对象。
优点
- 一个调用者想创建一个对象,只知道对象名称就可以了;
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;
- 屏蔽产品的具体实现,调用者只关心产品的接口;
缺点
- 每增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖,这并不是什么好事;
实现
我们将创建一个Shape接口和实现Shape接口的实体类。下一步时定义一个工厂类ShapeFactory。FactoryPatternDemo,演示类使用ShapeFactory来获取Shape对象。它将向ShapeFactory传递信息(CIRCLE/RECTANGLE/SQUARE),一边获取它所需对象的类型。
代码
package main
import "fmt"
//创建一个借口
type Shape interface {
Draw()
}
//实现接口的试题类型:矩形
type Rectangle struct {
}
func (this Rectangle) Draw() {
fmt.Println("Inside Rectangle::draw() method.")
}
//实现接口的试题类型:正方形
type Square struct {
}
func (this Square) Draw() {
fmt.Println("Inside Square::draw() method.")
}
//实现接口的试题类型:圆形
type Circle struct {
}
func (this Circle) Draw() {
fmt.Println("Inside Square::draw() method.")
}
//创建一个工厂,生成基于给定信息的实体类的对象
type ShapeFactory struct {
}
//使用getShape方法获取性转类型的对象
func (this ShapeFactory) getShape(shapeType string) Shape {
if shapeType == "" {
return nil
}
if shapeType == "CIRCLE" {
return Circle{}
} else if shapeType == "RECTANCLE" {
return Rectangle{}
} else if shapeType == "SQUARE" {
return Square{}
}
return nil
}
func main() {
factory := ShapeFactory{}
factory.getShape("CIRCLE").Draw()
factory.getShape("RECTANCLE").Draw()
factory.getShape("SQUARE").Draw()
}
输出
Inside Square::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.